Cod sursa(job #1478698)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 29 august 2015 12:38:31
Problema Prefix Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.02 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);

		l = lcur = lmax = lmaxcur = 0;
		for(j = 2; j < strlen(s); j++)
			if(p[j]){
				lmaxcur = p[j];
				if(!p[j - 1])
					lcur = j - 1;
				if(p[j - 1] && p[j - 1] == p[j - 2])
					lcur = j - 2;
				if(j == strlen(s) - 1 && lmaxcur >= lcur){
					lmax = lmaxcur;
					l = lcur;
				}
			}
			else
				if(p[j - 1]){
					if(lmaxcur >= lcur){
						lmax = lmaxcur;
						l = lcur;
					}
				}
		if(l)
			printf("%d\n", l * (lmax / l + 1));
		else
			printf("0\n");
	}
	return 0;
}

void prefix(char s[]){
	int i, k = 0;
	p[1] = 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;
	}
}