Cod sursa(job #36286)

Utilizator damaDamaschin Mihai dama Data 23 martie 2007 12:36:06
Problema Prefix Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char line[1048576], p[1048576]; 
int n, pi[1048576], t;

void prefix();

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

	scanf("%d ", &t);

	int test, i, ok;

	for(test = 0; test < t; ++test)
	{
		gets(line);
		scanf(" ");
		for(i = 1; i <= n; ++i)
			pi[i] = 0;
		n = 0;
		for(i = 0; i < strlen(line); ++i)
		{
			if(isalpha(line[i]))
			{
				p[++n] = line[i];
			}
		}
		prefix();
		ok = 0;
		for(i = n; i > 0; --i)
		{
			if(pi[i] && i % (i - pi[i]) == 0)
			{
				printf("%d\n", i);
				ok = 1;
				break;
			}
		}
		if(!ok)
			printf("0\n");
	}


	return 0;
}

void prefix()
{
	int i, k = 0;

	for(i = 2; i <= n; ++i)
	{
		while(p[k + 1] != p[i] && k)
			k = pi[k];
		if(p[k + 1] == p[i])
			++k;
		pi[i] = k;
	}
}