Pagini recente » Cod sursa (job #1478881) | Cod sursa (job #1931999) | Cod sursa (job #1000826) | Cod sursa (job #2944877) | Cod sursa (job #2305695)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
int N, pi[1000005];
char s[1000005];
bool isPeriodic[1000005];
inline int CMMDC(int a, int b)
{
int r = a % b;
while(r)
{
a = b;
b = r;
r = a % b;
}
return b;
}
void Solve()
{
pi[1] = 0;
int j = 0;
for(int i = 2; i <= N; i++)
{
while(j && s[j + 1] != s[i])
j = pi[j];
if(s[j + 1] == s[i])
j++;
pi[i] = j;
}
int sol = 0, currentMaxPeriod = 1;
for(int i = 2; i <= N; i++)
{
if(i % 2 == 0)
if(pi[i] == i / 2)
currentMaxPeriod = i / 2;
if(i % currentMaxPeriod == 0)
if(i == pi[i] + currentMaxPeriod)
sol = i;
}
fout << sol << '\n';
/*
for(int i = 1; i <= N; i++)
fout << s[i] << " ";
fout << '\n';
for(int i = 1; i <= N; i++)
fout << pi[i] << " ";
fout << '\n';
*/
}
int main()
{
int T;
fin >> T;
fin.get();
while(T--)
{
fin >> s;
N = strlen(s);
for(int i = N; i >= 1; i--)
s[i] = s[i - 1];
Solve();
}
return 0;
}