Cod sursa(job #3324014)

Utilizator boboc132Boboc Teodor boboc132 Data 20 noiembrie 2025 18:33:05
Problema Prefix Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

ifstream in("prefix.in");
ofstream out("prefix.out");

const int MAX=1000000;
const int P=137;
const long long MOD1=100000007,MOD2=100000009;
string A;
int max_len;
int NA;
int n;
long long hash1[MAX],hash2[MAX],P1[MAX],P2[MAX];
pair<long long,long long> base_hash;
int rez;
int curlen;

int maxim(int a,int b){
    return(a>b ? a:b);
}

pair<long long,long long>get_hash(int i,int j){
    long long HASH1,HASH2;
    HASH1=hash1[j];
    HASH2=hash2[j];
    int len=j-i+1;
    if(i>0){
        HASH1=(HASH1-(hash1[i-1]*1LL*P1[len]%MOD1)+MOD1)%MOD1;
        HASH2=(HASH2-(hash2[i-1]*1LL*P2[len]%MOD2)+MOD2)%MOD2;
    }
    return {HASH1,HASH2};
}

int main(){
    ios_base::sync_with_stdio(false);
    in.tie(NULL);
    out.tie(NULL);
    in>>n;
    for(int i=1;i<=n;i++){
        in>>A;
        NA=A.length();
        if(NA>0)
            max_len=1;
        else
            max_len=0;
        P1[0]=P2[0]=1;
        hash1[0]=A[0]%MOD1;
        hash2[0]=A[0]%MOD2;
        for(int i=1;i<NA;i++){
            hash1[i]=(hash1[i-1]*1LL*P+A[i])%MOD1;
            hash2[i]=(hash2[i-1]*1LL*P+A[i])%MOD2;
            P1[i]=(P1[i-1]*1LL*P)%MOD1;
            P2[i]=(P2[i-1]*1LL*P)%MOD2;
        }
        for(int len=1;len<=NA/2;len++){
            base_hash=get_hash(0,len-1);
            int curlen=len;
            for(int i=len;i+len<=NA;i+=len){
                pair<long long,long long>cur=get_hash(i,i+len-1);
                if(base_hash==cur){
                    curlen=i+len;
                }else{
                    break;
                }
            }
            max_len=maxim(max_len,curlen);
        }
        out<<max_len<<"\n";
    }
}