Cod sursa(job #285888)

Utilizator lolopolololopolo lolopolo Data 23 martie 2009 09:18:07
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#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;
}