제출 #1357335

#제출 시각아이디문제언어결과실행 시간메모리
1357335vjudge1Sateliti (COCI20_satellti)C++20
110 / 110
620 ms50624 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2e3+5;
long long n,m;
char a[N][N];
const int mod = 1e9+696969;
const int hash1 = 256;
const int hash2 = 311;
bool check[2*N][2*N];
long long pre[2*N][2*N];
long long power1[N],power2[N],inv1[N],inv2[N];
long long mu(long long x,long long y) {
    long long ans =1;
    while(y > 0) {
        if (y % 2 == 1) {
            ans *= x;
            ans %= mod;
        }
        x *= x;
        x %= mod;
        y /= 2;
    }
    return ans;
}
void build() {
    power1[0] = power2[0]=inv1[0] = inv2[0] = 1;
    for (int i= 1; i <= 2e3; i++) {
        power1[i] = (power1[i-1]*hash1)%mod;
        power2[i] = (power2[i-1]*hash2)%mod;
        inv1[i] = mu(power1[i],mod-2);
        inv2[i] = mu(power2[i],mod-2);
    }
}
long long calHash(long long x,long long y,long long x2,long long y2) {
    x--;
    y--;
    long long tmp = (pre[x2][y2]-(pre[x][y2]+pre[x2][y])%mod)%mod;
    tmp = (tmp+mod)%mod;
    tmp = (tmp+pre[x][y])%mod;
    tmp = (tmp*inv1[x])%mod;
    tmp = (tmp*inv2[y])%mod;
    return tmp;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for (int i= 1; i <= n; i++) {
        for(int j = 1;j  <= m; j++) {
            cin >> a[i][j];
        }
        for(int j = 1; j <= m; j++) {
            check[i][j] = check[i+n][j] = check[i][j+m] = check[i+n][j+m] = (a[i][j] == '.');
        }
    }
    build();
    for (int i= 1; i <= 2*n; i++) {
        for (int j = 1; j <= 2*m; j++) {
            pre[i][j] = check[i][j]*((power1[i]*power2[j])%mod);
            pre[i][j] += ((((pre[i-1][j]+pre[i][j-1])%mod)-pre[i-1][j-1])%mod + mod)%mod;
            pre[i][j] %= mod;
        }
    }
    long long x = 1,y = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (calHash(x,y,x+n-1,y+m-1) == calHash(i,j,i+n-1,j+m-1)) continue;
            long long l = -1,r = n-1;
            while(r-l > 1) {
                long long mid = (l+r)/2;
                if (calHash(x,y,x+mid,y+m-1) == calHash(i,j,i+mid,j+m-1)) {
                    l = mid;
                } else {
                    r = mid;
                }
            }
            long long R = r;
            l = -1,r = m-1;
            while(r-l > 1) {
                long long mid = (l+r)/2;
                if (calHash(x,y,x+R,y+mid) ==calHash(i,j,i+R,j+mid)) {
                    l = mid;
                } else {
                    r = mid;
                }
            }
            long long C = r;
            if (check[i+R][j+C] < check[x+R][y+C]) {
                x=  i,y = j;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (check[i+x][j+y]) {
                cout << ".";
            } else cout << "*";
        }
        cout << "\n";
    }
// hahah
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...