Pagini recente » Cod sursa (job #1095892) | Cod sursa (job #1323870) | Cod sursa (job #2125159) | Cod sursa (job #2251132) | Cod sursa (job #1478698)
#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;
}
}