Pagini recente » Cod sursa (job #1467728) | Cod sursa (job #1861142) | Cod sursa (job #812721) | Cod sursa (job #804866) | Cod sursa (job #1628337)
#include <iostream>
#include <fstream>
#include <string.h>
#include <string>
using namespace std;
const int Nmax = 1000666;
string A;
int T, ans = 0, m[Nmax], p[Nmax];
int main() {
ifstream fin ("prefix.in");
ofstream fout ("prefix.out");
fin >> T;
while(T--) {
fin >> A;
for (int i = 0; i <= A.size(); ++i) {
m[i] = 0;
p[i] = 0;
}
ans = 0;
m[0] = -1;
p[0] = 1;
for (size_t k = 1; k < A.size(); ++k) {
// find longest prefix of A_k
int q = m[k-1];
while(q >= 0) {
if (A[k] == A[q+1]) {
m[k] = q+1;
break;
}
q = m[q];
}
if (q == -1) {
if (A[k] == A[0])
m[k] = 0;
else
m[k] = -1;
}
// compute the largest period of A_k based on the longest prefix
p[k] = 1;
q = m[k];
if (q >= 0) {
if ((q+1)/p[q] % (k-q) == 0)
p[k] = p[q] + 1;
}
if (q >= 0 && p[k] > 1 && ans < k+1)
ans = k+1;
}
fout << ans << '\n';
}
return 0;
}