Cod sursa(job #786108)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 10 septembrie 2012 15:14:49
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <cassert>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 1000005;

int t, n;
int pi[N];
char text[N];

void prefix(char* text) {
	int p = 0;
	memset(pi, 0, sizeof(pi));
	
	for (int i = 2; i <= n; ++i) {
		while (p > 0 && text[p + 1] != text[i])
			p = pi[p];
		
		if (text[p + 1] == text[i])
			++p;
		
		pi[i] = p;
	}
}

int main() {
	assert(freopen("prefix.in", "r", stdin) != NULL);
	assert(freopen("prefix.out", "w", stdout) != NULL);
	
	assert(scanf("%d", &t) == 1);
	
	while (t--) {
		memset(text, 0, sizeof(text));
		assert(scanf("%s", text + 1) == 1);
		
		n = strlen(text + 1);
		prefix(text);
		
		while (n) {
			if (pi[n] && n % (n - pi[n]) == 0) {
				printf("%d\n", n);
				break;
			}
			--n;
		}
		if (n == 0)
			printf("0\n");
	}
}