Cod sursa(job #172075)

Utilizator andreisfrentSfrent Andrei andreisfrent Data 5 aprilie 2008 18:36:11
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <stdio.h>
#include <string.h>

#define maxN 2000003

char s[maxN];
int p[maxN];
int n, dif;

void rezolva_test();
void calcul_prefix();
bool f(int);

void rezolva_test()
{
	scanf("%s\n", s+1);
	n=strlen(s+1);
	calcul_prefix();
	bool ok;
	int x;
	for(x=n;x>0;--x)
	{
		dif = x - p[x];
		ok = f(p[x]);
		if(ok && dif!=x)
		{
			printf("%d\n",x);
			return;
		}
	}
	printf("0\n");
}

void calcul_prefix()
{
	p[1]=0;
	int k=0,i;
	for(i=2;i<=n;++i)
	{
		while((k>0) && (s[k+1] != s[i])) k=p[k];
		if(s[k+1] == s[i]) ++k;
		p[i]=k;
	}
}

bool f(int x)
{
	if(x==dif) return true;
	if(x-p[x]!=dif) return false;
	return f(p[x]);
}

int main()
{
	freopen("prefix.in", "r", stdin);
	freopen("prefix.out", "w", stdout);
	int nr_teste, cnt;
	scanf("%d\n", &nr_teste);
	for(cnt = 0; cnt < nr_teste; ++cnt) 
	{
		rezolva_test();	
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}