Pagini recente » Cod sursa (job #1389564) | Cod sursa (job #1294557) | Cod sursa (job #812773) | Cod sursa (job #1682415) | Cod sursa (job #1563544)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int pi[1000000];
char s[1000100];
int mx, k, n;
int main()
{
freopen("prefix.in", "rt", stdin);
freopen("prefix.out", "wt", stdout);
bool enter, ok;
int pr, dif;
int T; cin >> T;
for(int o = 1; o <= T; o ++) {
scanf("%s\n", s + 1); n = strlen(s + 1);
mx = 0; k = 0;
for(int i = 2; i <= n; i ++) {
while(k && s[i] != s[k + 1]) k = pi[k];
if(s[i] == s[k + 1]) k ++;
pi[i] = k;
}
for(int i = n; i >= 1; i --) {
k = 1; enter = false; ok = true; pr = i; dif = i - pi[i];
pr = pi[pr];
while(pr && pi[pr] && ok) {
if(pr != dif) {
enter = true;
if(pr && pi[pr]) {
if(dif != (pr - pi[pr])) ok = false;
}
k ++;
pr = pi[pr];
}
else break;
}
if((enter && ok && pr == dif) || (!enter && pr == dif)) {
k ++;
if(dif != n)
mx = k * dif, i = 1;
}
}
for(int i = 2; i <= n; i ++)
pi[i] = 0;
cout << mx << "\n";
}
return 0;
}