Cod sursa(job #5190)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 10 ianuarie 2007 21:06:06
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
# include <stdio.h>
# include <string.h>

# define  _fin  "prefix.in"
# define  fout  "prefix.out"

# define  maxn  1100000


char a[maxn];
int p[maxn], l, sol;


void prefix()
{
	int k=0, q;
	
	for (q=2; q<=l; q++)
	{
		while ( k>0 && a[k+1] != a[q] ) k = p[k];
		if ( a[k+1] == a[q] ) ++k;
		p[q] = k;
	}
}

void solve()
{
	memset(p,0,sizeof(p));
	prefix();
	
	int i;
	
	for (sol=0, i=1; i<=l; i++)
		if ( p[i] > 0 && i % ( i-p[i] ) == 0 ) sol = i;
}

int main()
{
	FILE *fin=fopen(_fin, "r");
	freopen(fout, "w", stdout);
	
	int t;

# define  cut(a) ( a[ strlen(a)-1 ] == '\n' ? a[ strlen(a)-1 ] = 0 : (0) )
	
	for (fscanf(fin, "%d\n", &t); t; --t)
	{
		fgets(a+1, maxn, fin), cut(a), a[0]=0x30;
		l = strlen(a);
		solve();
		
		printf("%d\n", sol);
	}
	
	return 0;
}