Submission #573415

#TimeUsernameProblemLanguageResultExecution timeMemory
573415pokmui9909Sateliti (COCI20_satellti)C++17
110 / 110
451 ms65100 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll P = 197, Q = 971, MOD = 998244353;
ll N, M;
ll A[2005][2005];
ll Hash[2005][2005];
ll Pm[2005], Qm[2005];
ll Pim[2005], Qim[2005];
ll Pow(ll A, ll B){
    if(B == 0) return 1;
    if(B % 2 == 1) return A * Pow(A, B - 1) % MOD;
    ll k = Pow(A, B / 2); return k * k % MOD;
}
ll Inv(ll A){
    return Pow(A, MOD - 2);
}
ll GetHash(ll x1, ll x2, ll y1, ll y2){
    ll K = (Hash[x2][y2] - Hash[x1 - 1][y2] - Hash[x2][y1 - 1] + Hash[x1 - 1][y1 - 1]) % MOD;
    K *= Pim[x1] * Qim[y1] % MOD; K %= MOD;
    return (K + MOD) % MOD;
}

int main(){
    cin.tie(0) -> sync_with_stdio(false);

    cin >> N >> M;
    for(ll i = 1; i <= N; i++){
        for(ll j = 1; j <= M; j++){
            char c; cin >> c;
            if(c == '*') A[i][j] = 0;
            else A[i][j] = 1;
            A[i + N][j] = A[i][j + M] = A[i + N][j + M] = A[i][j];
        }
    }
    for(ll i = 0; i < 2005; i++){
        Pm[i] = Pow(P, i), Pim[i] = Inv(Pm[i]);
        Qm[i] = Pow(Q, i), Qim[i] = Inv(Qm[i]);
    }
    for(ll i = 1; i <= 2 * N; i++){
        for(ll j = 1; j <= 2 * M; j++){
            Hash[i][j] = Hash[i - 1][j] + Hash[i][j - 1] - Hash[i - 1][j - 1] + (A[i][j] + 123) * Pm[i] % MOD * Qm[j] % MOD;
            Hash[i][j] %= MOD;
        }
    }
    ll x = 1, y = 1;
    for(ll i = 1; i <= N; i++){
        for(ll j = 1; j <= M; j++){
            if(i == 1 && j == 1) continue;
            ll L = 1, R = N;
            while(L <= R){
                ll m = (L + R) / 2;
                if(GetHash(x, x + m - 1, y, y + M - 1) != GetHash(i, i + m - 1, j, j + M - 1)) R = m - 1;
                else L = m + 1;
            }
            ll dx = L;
            L = 1, R = M;
            while(L <= R){
                ll m = (L + R) / 2;
                if(GetHash(x + dx - 1, x + dx - 1, y, y + m - 1) != GetHash(i + dx - 1, i + dx - 1, j, j + m - 1)) R = m - 1;
                else L = m + 1;
            }
            ll dy = L;
            if(A[x + dx - 1][y + dy - 1] > A[i + dx - 1][j + dy - 1]){
                x = i, y = j;
            }
        }
    }
    for(ll i = 1; i <= N; i++){
        for(ll j = 1; j <= M; j++){
            ll p = x + i - 1, q = y + j - 1;
            if(p > N) p -= N; if(q > M) q -= M;
            cout << (A[p][q] == 0 ? '*' : '.');
        }
        cout << '\n';
    }
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:73:13: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   73 |             if(p > N) p -= N; if(q > M) q -= M;
      |             ^~
Main.cpp:73:31: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
   73 |             if(p > N) p -= N; if(q > M) q -= M;
      |                               ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...