Pagini recente » Cod sursa (job #2184788) | Cod sursa (job #1981118) | Cod sursa (job #1920882) | Cod sursa (job #19968) | Cod sursa (job #285888)
Cod sursa(job #285888)
#include<stdio.h>
#include<string.h>
#define infile "prefix.in"
#define outfile "prefix.out"
#define nmax 1001*1001
char s[nmax]; //sirul
int p[nmax]; //prefixul
int n; //lungimea sirului
void prefix()
{
int i,k=-1;
p[0]=-1;
for(i=1;i<n;i++)
{
while(k>=0&&s[i]!=s[k+1]) k=p[k]; //locul de unde putem incepe verificarea
if(s[i]==s[k+1]) k++; //sunt egale
p[i]=k; //lungimea de unde putem porni
}
}
int prefix_maxim()
{
int i,lmax=0;
for(i=1;i<n;i++)
if(p[i]>=0&&!((i+1)%(i-p[i]))) //daca este prefix, si daca lungimea prefixului periodic este multiplu de lungimea prefixului normal
lmax=i+1; //aceasta este lungimea
return lmax; //returnam lungimea maxima
}
int main()
{
int t;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d\n",&t); //numarul de teste
while(t--) //rezolvam fiecare test
{
scanf("%s",s); //citim sirul
n=strlen(s); //lungimea sirului
prefix(); //calculeaza prefixul sirului
printf("%d\n",prefix_maxim()); //afisem lungimea prefixului periodic maxim
}
fclose(stdin);
fclose(stdout);
return 0;
}