Cod sursa(job #1072999)

Utilizator danny794Dan Danaila danny794 Data 5 ianuarie 2014 15:07:58
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <cstdio>

using namespace std;

#define MAXN 1000005

char text[MAXN];
int fi_text[MAXN], T;

void read() {
	freopen("prefix.in", "r", stdin);
	freopen("prefix.out", "w", stdout);

}

int getLength(char *c) {
	int length = 0;
	while( *c != '\0' ) {
		c++;
		length++;
	}
	return length;
}

void compute() {
	int length = getLength(text);
	fi_text[0] = -1;

	for(int i = 1; i < length; i++) {
		int k = fi_text[i - 1];
		while( k != -1 && text[i] != text[k + 1])
			k = fi_text[k];

		if (text[i] == text[k + 1])
			k++;

		fi_text[i] = k;
	}
	fi_text[length] = -2;

	int len = 0;

	for( int i = length - 1; i > 0; i-- ) {
		if( fi_text[i] != -1 && (i + 1) % (i - fi_text[i]) == 0) {
			len = i + 1;
			break;
		}
	}

	printf("%d\n", len);

}

int main() {
	read();
	scanf("%i", &T);
	while( T > 0 ) {
		scanf("%s", text);
		compute();
		T--;
	}
	return 0;
}