Submission #1075325

#TimeUsernameProblemLanguageResultExecution timeMemory
1075325vjudge1Sateliti (COCI20_satellti)C++14
110 / 110
554 ms37716 KiB
#include <bits/stdc++.h>
#define file(name)  if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
#define REV(i, b, a) for(int i = (b); i >= (a); --i)
#define REP(i, n) for(int i = 0; i < (n); ++i)
#define ll long long
#define fi first
#define se second
#define int long long
using namespace std;

const int N = 1005;
const int MOD = 1e9 + 7;
char s[2 * N][2 * N];
int pwx[2 * N], pwy[2 * N];
int h[2 * N][2 * N];
int n, m;

int basex = 31, basey = 11111;

void init_hash() {
    pwx[0] = pwy[0] = 1;
    for(int i = 1; i < 2 * N; ++i) {
        pwx[i] = pwx[i - 1] * basex % MOD;
    }
    for(int i = 1; i < 2 * N; ++i) {
        pwy[i] = pwy[i - 1] * basey % MOD;
    }
    FOR(i, 1, 2 * n) {
        FOR(j, 1, 2 * m) {
            h[i][j] = (h[i][j - 1] * basex % MOD + s[i][j]) % MOD;
        }
    }
    FOR(j, 1, 2 * m) {
        FOR(i, 1, 2 * n) {
            h[i][j] = (h[i - 1][j] * basey % MOD + h[i][j]) % MOD;
        }
    }
}

int getHash(int a, int b, int X,int Y){
    int x = a + X - 1;
    int y = b + Y - 1;
    int ans = (h[x][y] - h[x][b - 1] * pwx[y - b + 1] % MOD - h[a - 1][y] * pwy[x - a + 1] % MOD + MOD) % MOD;
    ans = (ans + h[a - 1][b - 1]*pwy[x - a + 1] % MOD * pwx[y - b + 1]) % MOD;
    return ans;
}

void solve(int tc) {
    cin >> n >> m;
    FOR(i, 1, n) {
        FOR(j, 1, m) {
            cin >> s[i][j];
            s[i + n][j] = s[i][j + m] = s[i + n][j + m] = s[i][j];
        }
    }
    init_hash();
    int a1 = 1, a2 = 1;
    FOR(i, 1, n) {
        FOR(j, 1, m) {
            int l = i - 1, r = i + n - 1, mid, res = 0;
            while(l <= r) {
                mid = l + r >> 1;
                if(getHash(i, j, mid - i + 1, m) == getHash(a1, a2, mid - i + 1, m)) {
                    res = mid;
                    l = mid + 1;
                } else r = mid - 1;
            }
            int row = res + 1;
            l = j - 1; r = j + m - 1, res = 0;
            while(l <= r) {
                mid = l + r >> 1;
                if(getHash(row, j, 1, mid - j + 1) == getHash(a1 + (row - i), a2, 1, mid - j + 1)) {
                    res = mid;
                    l = mid + 1;
                } else r = mid - 1;
            }
            int col = res + 1;
            if(row <= i + n - 1 && col <= j + m - 1 && s[row][col] < s[a1 + (row - i)][a2 + (col - j)]) {
                a1 = i, a2 = j;
            }
        }
    }
    for(int i = a1; i <= a1 + n - 1; ++i) {for(int j = a2; j <= a2 + m - 1; ++j) {
        cout << s[i][j];
    }cout << '\n';}
    return;
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int tc = 1;
    // cin >> tc;
    for(int i = 1; i <= tc; ++i) solve(tc);
    return (0);
}

Compilation message (stderr)

Main.cpp: In function 'void solve(long long int)':
Main.cpp:63:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   63 |                 mid = l + r >> 1;
      |                       ~~^~~
Main.cpp:72:25: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   72 |                 mid = l + r >> 1;
      |                       ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...