Pagini recente » Cod sursa (job #2612904) | Cod sursa (job #411523) | Cod sursa (job #108955) | Cod sursa (job #279182) | Cod sursa (job #599134)
Cod sursa(job #599134)
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000005;
char s[N];
int t, L[N];
inline int prefix(){
int v, k, n = strlen(s), i, max = 0;
L[1] = 0;
for(i = 2; i <= n; ++i){
k = L[i - 1];
while(k && s[k] != s[i - 1])
k = L[k];
if(s[k] == s[i - 1])
++k;
L[i] = k;
// printf("%d %d\n", i, k);
v = i;
while(k && 2 * L[v] >= v){
if(2 * L[v] == v)
max = i;
v = L[v];
}
}
return max;
}
int main() {
freopen("prefix.in", "r", stdin);
freopen("prefix.out", "w", stdout);
int i;
scanf("%d", &t);
for(i = 1; i <= t; ++i) {
scanf("\n%s", &s);
// printf("%s\n", s);
printf("%d\n", prefix());
}
return 0;
}