Cod sursa(job #195674)

Utilizator cipPaduraru Ciprian - Ionut cip Data 20 iunie 2008 16:51:26
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstring>
#include <cstdio>

#define MAX_N	1000001
#define max(a,b) (a > b? a : b)

int K[MAX_N];	//prefix
int length;

void makePrefix(char *data)
{
	int i, q = 0;
	for (i = 2, K[0] = 0; i <= length; ++i)
	{
		while(q > 0 && data[q+1] != data[i])
			q = K[q];

		if (data[q+1] == data[i])	q++;
		K[i] = q  ;
	}
}

int findPrecs(char *data)
{
	makePrefix(data);	
	/*
		Pentru a gasi un sir de o anumita periodicitate P trebuie sa respecte urmatoarele 2 conditii :

			K[P] > 0 
			P % (P - K[P])
	*/
	int iMaxDim = 0;
	for (int i = length ; i >= 2 ;i--)
		if (K[i] > 0 && (i % (i - K[i]) == 0))
		{	
			iMaxDim = i;
			break;
		}

	return iMaxDim;

}

void solve()
{
	int n;
	scanf("%d",&n);
	char sir[MAX_N];
	for (int i=0;i<n;i++)
	{
		scanf("%s\n",&sir);
		length = strlen(sir);
		for (int j = length; j >= 1;j--)
			sir[j] = sir[j-1];
		printf("%d\n",findPrecs(sir));
	}
}

int main()
{
	freopen("prefix.in","r",stdin);
	freopen("prefix.out","w",stdout);
	solve();

	return 0;
}