Cod sursa(job #172643)

Utilizator hadesgamesTache Alexandru hadesgames Data 6 aprilie 2008 16:56:11
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.75 kb
#include <stdio.h>
#include <string.h>
int dif,pi[1000005];
char s[1000000];
int ver(int i)
{
	if (dif<=0)
		return 0;
	if (i==dif)
		return 1;
	if (i-pi[i]==dif)
		return ver(pi[i]);
	else
		return 0;
}
int main()
{
	FILE *in,*out;
	int t,k,i,max,x,y;
	in=fopen("prefix.in","r");
	out=fopen("prefix.out","w");
	fscanf(in,"%d",&t);
	for (k=1;k<=t;k++)
	{
		fscanf(in,"%s",s+1);
		pi[1]=0;
		x=strlen(s+1);
		max=0;
		y=0;
		for (i=2;i<=x;i++)
		{
		
			while (s[y+1]!=s[i]&&y)
				y=pi[y];
			if (s[y+1]==s[i])
				y++;
			pi[i]=y;
		}
		for (i=x;i>=2;i--)
		{
			dif=i-pi[i];
			if (ver(i)&&i>max&&pi[i]!=0)
			{
				max=i;
				break;
			}
		}
		fprintf(out,"%d\n",max);
	}
	fclose(in);
	fclose(out);
	return 0;
}