Cod sursa(job #172072)

Utilizator a7893Nae Mihai a7893 Data 5 aprilie 2008 18:34:23
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include<stdio.h>
#include<string.h>
#define N 1000000
int t,n,pi[N],dif;
char a[N];
void prefix()
{
	int i,k;
	pi[1]=0;
	k=0;
	for(i=2;i<=n;i++)
	{
		while(k>0&&a[k+1]!=a[i])
			k=pi[k];
		if(a[k+1]==a[i])
			k++;
		pi[i]=k;
	}
}
bool f(int x)
{
	if(x==dif)
		return true;
	if(x-pi[x]!=dif)
		return false;
	return f(pi[x]);
}
void solve()
{
	memset(pi,0,sizeof(pi));
	int x;
	prefix();
	bool ok;
	for(x=n;x;x--)
	{
		dif=x-pi[x];
		ok=f(pi[x]);
		if(ok&&dif!=x){
			printf("%d\n",x);
			return;
		}
	}
	printf("0\n");
}
void read()
{
	int i;
	scanf("%d",&t);
	for(i=1;i<=t;i++)
	{
		scanf("%s",a+1);
		n=strlen(a+1);
		solve();
	}
}
int main()
{
	freopen("prefix.in","r",stdin);
	freopen("prefix.out","w",stdout);
	read();
	return 0;
}