Pagini recente » Cod sursa (job #3344965) | Cod sursa (job #3349487) | Cod sursa (job #2642872) | Cod sursa (job #3350167) | Cod sursa (job #3324014)
#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";
}
}