Cod sursa(job #2518151)

Utilizator Cezar211Popoveniuc Cezar Cezar211 Data 5 ianuarie 2020 00:57:21
Problema Prefix Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <bits/stdc++.h>
#define MOD int(1e9+9)
#define NM  1000005
using namespace std;
ifstream fin ("prefix.in");
ofstream fout ("prefix.out");
int n, q, ok;
long long h[NM], p[NM];
char s[NM];
int main()
{
    fin >> q;
    fin.get();
    p[0] = 1;
    for(int i=1; i<NM; i++)
        p[i] = (1LL*p[i-1]*31)%MOD;
    while(q--)
    {
        fin.getline(s, NM);
        n = strlen(s);
        for(int i=0; i<n; i++)
            h[i] = 1LL*((((i>0)?h[i-1]:0)) + (s[i]-'a'+1)*p[i]%MOD)%MOD;
        ok = 0;
        int ans = 0;
        for(int i=n/2-1; i>=0; --i)
            if((1LL*h[i]*p[i+1])%MOD == (h[2*i+1] - h[i]+MOD)%MOD)
            {
                ok = 1;
                for(int j=2*i+1; j<n && ok; j+=i+1)
                    if((h[j]-h[j-i-1]+MOD)%MOD == (1LL*h[i]*p[j-i])%MOD)
                        ans = max(ans, j);
                    else ok = 0;
                if(ans)
                break;
            }
        if(ans)
            fout << ans+1 << '\n';
        else fout << "0\n";
    }
    return 0;
}