Pagini recente » Cod sursa (job #455930) | Istoria paginii utilizator/alexandru_cristina_elena_321cb | Cod sursa (job #372258) | Cod sursa (job #301564) | Cod sursa (job #1090164)
#include <cstdio>
#include <cstring>
using namespace std;
const int knmax = 1000005;
bool dp[knmax];
int t[knmax];
char sr[knmax];
int pref(char *v){
int ans = 0, p;
memset(t, 0, sizeof(t));
memset(dp, 0, sizeof(dp));
int sz = strlen(v + 1);
for(int i = 2; i <= sz; ++i){
p = i - 1;
do{
p = t[p];
if(v[i] == v[p + 1]){
t[i] = p + 1;
break;
}
}while(p);
if(!(i & 1))
if(t[i] == i / 2)
dp[i] = 1;
if(dp[t[i]] && t[i] > i / 2)
dp[i] = 1;
if(dp[i])
ans = i;
}
return ans;
}
int main(){
freopen("prefix.in", "r", stdin);
freopen("prefix.out", "w", stdout);
int ts;
scanf("%d\n", &ts);
while(ts --){
gets(sr + 1);
printf("%d\n", pref(sr));
}
return 0;
}