Pagini recente » Cod sursa (job #2341857) | Cod sursa (job #2387405) | Cod sursa (job #1600622) | Cod sursa (job #2620124) | Cod sursa (job #1563541)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int pi[1000000];
int main()
{
freopen("prefix.in", "rt", stdin);
freopen("prefix.out", "wt", stdout);
int T; cin >> T;
for(int o = 1; o <= T; o ++) {
int mx = 0; char s[1000100];
scanf("%s\n", s + 1); int n = strlen(s + 1);
int 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; bool enter = false, ok = true; int 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 = max(mx, k * dif);
}
}
for(int i = 2; i <= n; i ++)
pi[i] = 0;
cout << mx << "\n";
}
return 0;
}