Pagini recente » Cod sursa (job #2738374) | Cod sursa (job #2519487) | Cod sursa (job #18155) | sa_fac_schema | Cod sursa (job #1478880)
#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");
}