Cod sursa(job #291868)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 30 martie 2009 15:10:49
Problema Prefix Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#define Q 10005
char N[Q],M[Q];
int n,m,pi[Q],v[Q],k,num;
bool ok;
void p()
{
	k=0;
	pi[1]=0;
	for (int i=2; i<=m; ++i)
	{
		while (k&&M[k+1]!=M[i])
			k=pi[k];
		if (M[k+1]==M[i])
			++k;
		pi[i]=k;
	}
}
void kmp()
{
	k=0;
	num=0;
	for (int i=1; i<=n; ++i)
	{
		while (k&&M[k+1]!=N[i])
			k=pi[k];
		if (M[k+1]==N[i])
			++k;
		if (k==m)
		{
			int y=i-m;
			if (num)
				if (v[num]+m==y)
				{
					v[++num]=y;
				}
				else
					break;
			else v[++num]=y;	
			/*v[++num]=i-m;
			ok=true;
			if (v[num-1]+m>v[num])
			{	
				--num;
				ok=false;
			}
			else
				if (v[num-1]+m<v[num])
				break;*/
			k=pi[m];
		}
	}
}
void citire()
{
	freopen("prefix.in","r",stdin);
	freopen("prefix.out","w",stdout);
	int x;
	scanf("%d\n",&x);
	for (int i=1; i<=x; ++i)
	{
		fgets(N,sizeof(N),stdin);
		n=0;
		while (N[n])++n;--n;
		for (int j=n; j; --j)N[j]=N[j-1];
		N[0]=' ';
		int n1=n/2,j=1;
		M[0]=' ';
		int max=0;
		while (j<=n1)
		{
			M[j]=N[j];
			m=j;
			p();
			kmp();
			/*if (ok)
			--num;*/
			if (num!=1)
			if (max<num*m)
				max=num*m;
			++j;
		}
		printf("%d\n",max);
	}
}
int main()
{
	citire();
	return 0;
}