Pagini recente » Cod sursa (job #1585747) | Cod sursa (job #586779) | Cod sursa (job #1642556) | Cod sursa (job #2294885) | Cod sursa (job #2445932)
#include <cstring>
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin ("prefix.in");
ofstream fout ("prefix.out");
const int MAXN =1e6 + 5;
int Z[MAXN],n,t, last[2005];
char T[MAXN];
void getZarr( ) {
int L, R, k;
L = R = 0;
for (int i = 1; i < n; ++i) {
if (i > R) {
L = R = i;
while (R<n && T[R-L] == T[R])
R++;
Z[i] = R-L;
R--;
} else {
k = i-L;
if (Z[k] < R-i+1)
Z[i] = Z[k];
else {
L = i;
while (R<n && T[R-L] == T[R])
R++;
Z[i] = R-L;
R--;
}
}
}
}
int main() {
fin >> t;
for ( ; t > 0; --t) {
fin >> (T);
n = strlen(T);
getZarr();
int ma = 0;
for ( int i = 0; i < n; ++i) {
if ( Z[i] >= i)
ma = max(ma,2*i);
}
for (int i = 0; i <= 2000; ++i)
last[i] = -1;
int Max = 0;
for (int i = 0; i < ma; ++i) {
if (last[T[i]] != -1) {
if (Max < i - last[T[i]])
Max = i - last[T[i]];
}
last[T[i]] = i;
}
if (ma + Max <= n) {
bool ok = true;
for (int i = 0; i < Max; ++i)
if (T[i] != T[i + ma]) {
ok = false;
break;
}
if (ok)
ma += Max;
}
fout << ma << "\n";
}
}