Cod sursa(job #195460)

Utilizator cipPaduraru Ciprian - Ionut cip Data 18 iunie 2008 17:49:30
Problema Prefix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <cstring>

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

char sir[MAX_N],sir2[MAX_N];

bool takeSir(char *input,char *output,int iBegin,int iLength)
{
	if ((iBegin+iLength) > (int)strlen(input))
		return false;

	for (int i=iBegin;i<iBegin+iLength;i++)
		output[i-iBegin] =	input[i];

	output[iLength]='\0';

	return true;
}

bool EqualyStrings(char *s,char *p)
{
	int length = strlen(s);
	if (length != strlen(p))
		return false;

	for (int i=0;i < length;i++)
		if (s[i] != p[i])
			return false;

	return true;
}

int findPrecs(char *data)
{
	int n = strlen(data);
	
	int maxDim = 0;

	for (int l=1;l<=n/2;l++)
	{
		
		bool taken = takeSir(data,sir,0,l),bPeriodicyCanContinue;
		int indexLeft = l;
		int nrTries = 1;

		if (taken)
		do
		{
			bPeriodicyCanContinue = false;
			taken = takeSir(data,sir2,indexLeft,l);
			if (taken)
			{
				indexLeft += l;
				if (bPeriodicyCanContinue = EqualyStrings(sir,sir2))
					nrTries++;
			}

		}while(bPeriodicyCanContinue);

		if (nrTries > 1)
			maxDim = max(maxDim,nrTries * l);

	}

	return  maxDim;
}

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

int main(void)
{
	freopen("strmatch.in", "r", stdin);
	freopen("strmatch.out", "w", stdout);
	
	solve();
	return 0;
}