Cod sursa(job #1478880)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 29 august 2015 20:01:33
Problema Prefix Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <stdio.h>
#include <string.h>
#define MAX 1000005

int t, i, j, p[MAX], l, lmax, lcur, lmaxcur;
char s[MAX];

void prefix(char s[]);

int main(){
	freopen("prefix.in", "r", stdin);
	freopen("prefix.out", "w", stdout);
	scanf("%d\n", &t);
	for(i = 0; i < t; i++){
		memset(s, 0, MAX);
		scanf("%s\n", s);
		for(j = strlen(s); j > 0; j--)
			s[j] = s[j - 1];
		prefix(s);
	}
	return 0;
}

void prefix(char s[]){
	int i, k = 0;
	p[1] = l = lcur = lmax = lmaxcur = 0;
	for(i = 2; i < strlen(s); i++){
		while(k > 0 && s[k + 1] != s[i])
			k = p[k];
		if(s[k + 1] == s[i])
			k++;
		p[i] = k;

		if(p[i] == 1)
			lcur = i - 1;
		if(p[i])
			lmaxcur = p[i];

		if(((!p[i] && p[i - 1]) || i == strlen(s) - 1) && lmaxcur >= lcur){
			l = lcur;
			lmax = lmaxcur;
		}
	}

	if(l)
		printf("%d\n", l * (lmax / l + 1));
	else
		printf("0\n");
}