Pagini recente » Cod sursa (job #352944) | Cod sursa (job #2901866) | Cod sursa (job #608969) | Cod sursa (job #2793353) | Cod sursa (job #2440514)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#define NMAX 1000002
#define PRIM1 1299709
#define PRIM2 1299841
using namespace std;
char s[NMAX];
void solve()
{
map<long long int, long long int> m1;
map<long long int, long long int> m2;
long long int h1 = 0;
long long int h2 = 0;
long long int r1 = 27;
long long int r2 = 27;
scanf("%s", &s);
int maxLen = 0;
for (int i = 0; s[i] != NULL; ++i)
{
h1 += ((long long int)(s[i] - 'a' + 1)) * r1;
h1 %= PRIM1;
h2 += ((long long int)(s[i] - 'a' + 1)) * r2;
h2 %= PRIM2;
bool ok = (s[i + 1] == s[0]);
if (m1[h1] && m2[h2])
{
maxLen = i + 1;
if (ok)
{
long long int root1 = m1[h1];
long long int root2 = m2[h2];
m1[(h1 + r1 * root1) % PRIM1] = root1;
m2[(h2 + r2 * root2) % PRIM2] = root2;
}
}
if (ok)
{
m1[(h1 + r1 * h1) % PRIM1] = h1;
m2[(h2 + r2 * h2) % PRIM2] = h2;
}
r1 = (r1 * 27) % PRIM1;
r2 = (r2 * 27) % PRIM2;
}
printf("%d\n", maxLen);
}
int main()
{
freopen("prefix.in", "r", stdin);
freopen("prefix.out", "w", stdout);
int t;
scanf("%d", &t);
for (int i = 0; i < t; ++i)
solve();
return 0;
}