Pagini recente » Cod sursa (job #3214381) | Cod sursa (job #303193) | Cod sursa (job #3263803) | Cod sursa (job #2221415) | Cod sursa (job #2749297)
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
const int NMAX = 1e6;
int pi[1 + NMAX];
std::string a;
int main() {
std::ifstream in("prefix.in");
std::ofstream out("prefix.out");
int tests;
in >> tests;
while (tests--) {
in >> a;
int ans = 0;
memset(pi, 0, sizeof(pi));
a = "." + a;
int k = 0;
pi[1] = 0;
for (int i = 2; i < a.size(); ++i) {
while (k > 0 && a[k + 1] != a[i])
k = pi[k];
if (a[k + 1] == a[i])
++k;
pi[i] = k;
}
int seq_start = -1;
for (int i = 1; i < a.size(); ++i) {
if (pi[i] == 1) {
seq_start = i;
while (i + 1 < a.size() && pi[i + 1] == pi[i] + 1)
++i;
// { seq_start , i }
int len = i - seq_start + 1;
int period_len = seq_start - 1;
int k = len / period_len + 1;
if (k > 1)
ans = std::max(ans, k * period_len);
}
}
out << ans << '\n';
}
return 0;
}