Pagini recente » Cod sursa (job #862490) | Cod sursa (job #2296814) | Cod sursa (job #2082664) | Cod sursa (job #737627) | Cod sursa (job #2430112)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
char pattern[1000010];
int helper[1000010];
int n;
short t;
void buildHelper()
{
for(int i = 1,j=0; i<=n;)
{
if(pattern[i]==pattern[j])
{
helper[i]=j+1;
i++;
j++;
}
else
{
if(j!=0)
j = helper[j-1];
else
i++;
}
}
}
void resetHelper()
{
for(int i = 0;i<=n;i++)
helper[i]=0;
}
void calcPrefix()
{
int maxim = 0,indexMax = 0,patternSize=0;
for(int i = 0;i<=n;i++)
{
if(maxim<helper[i])
{
maxim = helper[i];
indexMax = i;
}
}
for(int i = indexMax-1;i>=0;i--)
{
if(helper[i]!=helper[i+1]-1|| helper[i]==0){
patternSize = i+1;
break;
}
}
if(maxim==0)
fout<<0<<'\n';
else
fout<<maxim -(maxim%patternSize) + patternSize<<'\n';
}
int main()
{
int k;
fin>>t;
for(int i = 1; i<=t; i++)
{
fin>>pattern;
for(k = 0; pattern[k]!='\0'; k++);
n = k-1;
buildHelper();
calcPrefix();
resetHelper();
}
fin.close();
fout.close();
return 0;
}