Pagini recente » Cod sursa (job #2913930) | Cod sursa (job #2534034) | Cod sursa (job #279683) | Cod sursa (job #1588275) | Cod sursa (job #2446104)
#include <cstring>
#include <fstream>
#include <iostream>
#include <cmath>
using namespace std;
ifstream fin ("prefix.in");
ofstream fout ("prefix.out");
const int MAXN =1e6 + 5;
int Z[MAXN],n,t, last[2005], dif[27], ma;
char T[MAXN];
bool exista[27];
int CMMDC(int x, int y) {
int r = x % y;
while (r) {
x = y;
y = r;
r = x % y;
}
return y;
}
bool ok(int Max) {
for (int i = 0; i < Max; ++i) {
for (int j = Max; j <= ma; j += Max) {
if (T[i] != T[i + j])
return false;
}
}
return true;
}
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();
ma = 0;
for ( int i = 0; i < n; ++i) {
if ( Z[i] >= i)
ma = max(ma,2*i);
}
int cmmdc;
for (int i = 0; i < 26; ++i)
dif[i] = 0;
for (int i = 0; i < ma; ++i) {
++dif[T[i] - 'a'];
cmmdc = dif[T[i] - 'a'];
}
for (int i = 0; i < 26; ++i) {
if (dif[i]) {
cmmdc = CMMDC(cmmdc, dif[i]);
}
}
cmmdc = ma;
int start = sqrt(ma);
bool OK = false;
for (int i = start; i; --i) {
if (cmmdc % i == 0) {
int l = ma / (cmmdc / i);
if (ok(l)) {
ma += l;
OK = true;
break;
}
}
}
if (!OK) {
for (int i = start; i; --i) {
if (cmmdc % i == 0) {
int l = ma / i;
if (ok(l)) {
ma += l;
break;
}
}
}
}
fout << ma << "\n";
}
}