Pagini recente » Cod sursa (job #2895593) | Cod sursa (job #2771133) | simulareg_2 | Cod sursa (job #2692357) | Cod sursa (job #2695849)
#include<fstream>
#include<cstring>
#include<iostream>
#define P 73
#define MOD1 100007
#define MOD2 100021
#define N 1000005
using namespace std;
int i, nr = 0, H, H2, has, has2, v[N], v2[N], pow1[N], pow2[N], ma = 0;
char c[N];
int prefix(char m[], char n[], int l1)
{
int l2 = strlen(n);
nr = 0, H = 0, H2 = 0, has = 0, has2 = 0;
for(int i = l1 * 2; i <= l2; i += l1)
{
has = (v[i] - (1ll * v[i - l1] * pow1[l1]) % MOD1 + MOD1) % MOD1;
has2 = (v2[i] - (1ll * v2[i - l1] * pow2[l1]) % MOD2 + MOD2) % MOD2;
if(!(has == v[l1] && has2 == v2[l1]))
{
if(i == l1 * 2)
return 0;
else
return i - l1;
}
}
if(l2 % l1 == 0)
return l2;
return l2 - l2 % l1;
}
int n, j;
int main()
{
freopen("prefix.in", "r", stdin);
freopen("prefix.out", "w", stdout);
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> c;
int l1 = strlen(c);
for(int j = 1 ; j <= l1 ; j++)
{
v[j] = (v[j - 1] * P + c[j - 1]) % MOD1;
v2[j] = (v2[j - 1] * P + c[j - 1]) % MOD2;
}
pow1[0] = 1;
pow2[0] = 1;
for(int j = 1; j < l1; j ++)
{
pow1[j] = (pow1[j - 1] * P) % MOD1;
pow2[j] = (pow2[j - 1] * P) % MOD2;
}
for(j = l1 / 2 ; j > 0; j--)
{
ma = max(prefix(c, c, j), ma);
}
cout << ma << endl;
ma=0;
}
}