Cod sursa(job #1072989)

Utilizator danny794Dan Danaila danny794 Data 5 ianuarie 2014 14:51:54
Problema Prefix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 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 = 0; i < length; i++ ) {
		int begin = i;

		while( i < length && fi_text[i + 1] == 1 + fi_text[i]) {
			i++;
		}

		int end = i;

		if (end >= 2 * begin && end > 0)
			len = (end + 1) / (begin + 1) * (begin + 1);
	}

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

}

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