Pagini recente » Cod sursa (job #2568991) | Cod sursa (job #1778042) | Cod sursa (job #801847) | Cod sursa (job #664641) | Cod sursa (job #390466)
Cod sursa(job #390466)
#include <iostream>
#include <fstream>
using namespace std;
char S[1000010];
int T, Urm[1000010];
int main() {
FILE *f1=fopen("prefix.in", "r"), *f2=fopen("prefix.out", "w");
int i, j, p, s, k, poz;
char c;
fscanf(f1, "%d", &T);
while(T--) {
fscanf(f1, "%s", S+1);
fscanf(f1, "%c", &c);
s=strlen(S+1);
Urm[1]=0; k=0;
for(i=2; i<=s; i++) {
while(k>0 && S[i]!=S[k+1]) {
k=Urm[k];
}
if(S[i]==S[k+1]) { k++; }
Urm[i]=k;
}
/**
for(i=1; i<=s; i++) {
cout<<Urm[i]<<", ";
}
**/
//aflu cea mai lunga perioada
p=0;
for(i=2; i<=s; i+=2) {
if(Urm[i]==(i >> 1)) {
p=Urm[i];
}
}
poz=0;
if(p) {
for(i=2*p; i<=s; i+=p) {
if(Urm[i]==i-p) {
poz=i;
}
}
}
fprintf(f2, "%d\n", poz);
}
fclose(f1); fclose(f2);
return 0;
}