Cod sursa(job #3161181)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 25 octombrie 2023 23:38:23
Problema Prefix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>
#include <random>
#include <chrono>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const char nl = '\n';
const char sp = ' ';
const int inf = 0x3f3f3f3f;
const long long INF = 1000000000000000000;
const int mod = 1e9 + 7;
const char out[2][4]{ "NO", "YES" };
#define all(a) a.begin(), a.end()
using ll = long long;
ifstream fin("prefix.in");
ofstream fout("prefix.out");

#define variableName(var) #var
#define __debug(var) cout << #var << " = " << var << '\n'
inline int rint(int a, int b) { return uniform_int_distribution<int>(a, b)(rng); }

ll ppow(ll n, ll p) {
    if (p == 0) {
        return 1;
    }
    ll rt = ppow(n, p >> 1);
    return (rt * rt % mod) * (p & 1 ? n : 1) % mod;
}

const int base = 123457;
const int inv_base = ppow(base, mod - 2);
const int nmax = 1e6;
char str[nmax + 5];
ll h[nmax + 5]{ 0 };
ll p[nmax + 5]{ 1 };
ll q[nmax + 5]{ 1 };
int n;

ll get(int l, int r) {
    return ((h[r] - h[l - 1] + mod) % mod) * q[l - 1] % mod;
}

void testcase() {
    fin >> (str + 1);
    n = strlen(str + 1);
    for (int i = 1; i <= n; ++i) {
        h[i] = (h[i - 1] + (str[i] - 'a' + 1) * p[i] % mod) % mod;
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        // i - lenght of piece
        int len = i;
        while (len + i <= n && get(1, i) == get(len + 1, len + i)) {
            len += i;
        }
        if (len > i) {
            ans = max(ans, len);
        }
    }
    fout << ans << nl;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    for (int i = 1; i <= nmax; ++i) {
        p[i] = p[i - 1] * base % mod;
        q[i] = q[i - 1] * inv_base % mod;
    }
    int tc;
    fin >> tc;
    for (int t = 1; t <= tc; ++t) {
#ifdef LOCAL
        cerr << "=== Subtask " << t << " ===" << nl;
#endif
        testcase();
#ifdef LOCAL
        cerr << nl;
#endif
    }
}