Submission #1137859

#TimeUsernameProblemLanguageResultExecution timeMemory
1137859eysbutnoSateliti (COCI20_satellti)C++20
50 / 110
577 ms502116 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = array<int, 2>; #define all(x) begin(x), end(x) #define sz(x) (int) (x).size() constexpr int M = 1e9 + 9; constexpr int B = 9973; constexpr int LG = 10; using Info = array<ll, LG>; int main() { cin.tie(0) -> sync_with_stdio(0); int n, m; cin >> n >> m; vector grid(2 * n, vector<int>(2 * m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { char c; cin >> c; // bool v = (c == '.'); int v = c; // lol grid[i][j] = v; grid[i + n][j] = v; grid[i][j + m] = v; grid[i + n][j + m] = v; } } vector<ll> pows(n * m + 1); pows[0] = 1; for (int i = 1; i <= n * m; i++) { pows[i] = (pows[i - 1] * B) % M; } vector lr(2 * n, vector<Info>(m)); vector lc(2 * n, vector<Info>(2 * m)); int row = n - 1, col = m - 1; for (int i = 2 * n - 1; i >= 0; i--) { for (int j = 2 * m - 1; j >= 0; j--) { lc[i][j][0] = grid[i][j]; for (int k = 1; k < LG; k++) { if (j + (1 << k) > 2 * m) { break; } const int nxt = j + (1 << (k - 1)); lc[i][j][k] = (lc[i][j][k - 1] + pows[1 << (k - 1)] * lc[i][nxt][k - 1]) % M; } } ll cur = 0; for (int j = 2 * m - 1; j >= m; j--) { cur = (cur * B + grid[i][j]) % M; } for (int j = m - 1; j >= 0; j--) { cur -= pows[m - 1] * grid[i][j + m] % M; (cur += M) %= M; cur = (cur * B + grid[i][j]) % M; lr[i][j][0] = cur; for (int k = 1; k < LG; k++) { if (i + (1 << k) > 2 * n) { continue; } const int nxt = i + (1 << (k - 1)); lr[i][j][k] = (lr[i][j][k - 1] + pows[1 << (k - 1)] * lr[nxt][j][k - 1]) % M; } } if (i >= n) { continue; } for (int j = 0; j < m; j++) { int diff = 0; for (int k = LG - 1; k >= 0; k--) { if (diff + (1 << k) > n) { continue; } if (lr[row + diff][col][k] == lr[i + diff][j][k]) { diff += (1 << k); } } if (diff == n) { continue; } int diff2 = 0; for (int k = LG - 1; k >= 0; k--) { if (diff2 + (1 << k) > m) { continue; } if (lc[row + diff][col + diff2][k] == lc[i + diff][j + diff2][k]) { diff2 += (1 << k); } } if (grid[i + diff][j + diff2] < grid[row + diff][col + diff2]) { row = i, col = j; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout << char(grid[row + i][col + j]); } cout << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...