Submission #445993

#TimeUsernameProblemLanguageResultExecution timeMemory
445993grtSateliti (COCI20_satellti)C++17
110 / 110
683 ms19084 KiB
#include <bits/stdc++.h> #define ST first #define ND second #define PB push_back using namespace std; using ll = long long; using pi = pair<int,int>; using vi = vector<int>; const int nax = 1000 + 10, p = 31, q = 317, mod = 1e9 + 7; int n, m; char t[nax][nax]; int hsh[2 * nax][2 * nax], pot1[2 * nax], pot2[2 * nax]; pi ans; int subrect(int a, int b, int c, int d) { int w = (hsh[c][d] - (ll)pot2[d - b + 1] * hsh[c][b - 1] - (ll)pot1[c - a + 1] * hsh[a - 1][d]) % mod; w = (w + (ll)(((ll) pot2[d - b + 1] * hsh[a - 1][b - 1])%mod) * pot1[c - a + 1]) % mod; if(w < 0) w += mod; return w; } int main() { ios_base::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 >> t[i][j]; } } pot1[0] = pot2[0] = 1; for(int i = 1; i <= 2 * max(n, m); ++i) { pot1[i] = ((ll)pot1[i - 1] * p) % mod; pot2[i] = ((ll)pot2[i - 1] * q) % mod; } for(int i = 1; i <= 2 * n; ++i) { for(int j = 1; j <= 2 * m; ++j) { hsh[i][j] = ((ll)hsh[i - 1][j] * p + (ll)hsh[i][j - 1] * q - (ll)hsh[i - 1][j - 1] * p * q + (t[(i - 1) % n + 1][(j - 1) % m + 1] == '.' ? 1 : 2)) % mod; if(hsh[i][j] < 0) hsh[i][j] += mod; } } ans = {1, 1}; for(int i = 1; i <= n; ++i) { for(int j = 1; j <= m; ++j) { if(i == j && i == 1) continue; int low = 1, high = n, mid; while(low <= high) { mid = (low + high) / 2; if(subrect(ans.ST, ans.ND, ans.ST + mid - 1, ans.ND + m - 1) != subrect(i, j, i + mid - 1, j + m - 1)) { high = mid - 1; } else { low = mid + 1; } } high++; if(high == n + 1) continue; int row = high; low = 1; high = m; while(low <= high) { mid = (low + high) / 2; if(subrect(ans.ST + row - 1, ans.ND, ans.ST + row - 1, ans.ND + mid - 1) != subrect(i + row - 1, j, i + row - 1, j + mid - 1)) { high = mid - 1; } else { low = mid + 1; } } //cout << ans.ST << " " << ans.ND << " " << i << " " << j << " " << row << " " << high + 1 << "\n"; if(t[(ans.ST + row - 2) % n + 1][(ans.ND + high - 1) % m + 1] == '.') { ans = {i, j}; } } } for(int i = ans.ST; i < ans.ST + n; ++i) { for(int j = ans.ND; j < ans.ND + m; ++j) { cout << t[(i - 1) % n + 1][(j - 1) % m + 1]; } cout << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...