Pagini recente » Cod sursa (job #901325) | Cod sursa (job #3249498) | Cod sursa (job #3263836) | Cod sursa (job #763267) | Cod sursa (job #2675267)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");
char pattern[2000005];
int prefix[2000005], n;
void read()
{
f.getline(pattern+1, 2000005);
n = strlen(pattern+1);
memset(prefix, 0, sizeof(prefix));
}
void calcPrefix()
{
int j = 0;
for(int i = 2; i <= n; i++)
{
while(j > 0 && pattern[i] != pattern[j+1])
{
j = prefix[j];
}
if(pattern[i] == pattern[j+1])
{
j++;
}
prefix[i] = j;
}
}
int findMaxPref()
{
int j = 0;
for(int i = n; i >= 1; i--)
{
if(prefix[i] >= (i+1)/2)
{
if(prefix[i] % (i - prefix[i]) == 0)
{
return i;
}
}
}
return 0;
}
void afisare()
{
for(int i = 1; i<=n; i++)
g<<prefix[i]<<" ";
g<<"\n";
}
int main()
{
int T;
f>>T;
f.get();
for(int i = 0; i<T; i++)
{
read();
calcPrefix();
//afisare();
g<<findMaxPref()<<"\n";
}
return 0;
}