Pagini recente » Cod sursa (job #2328866) | Cod sursa (job #2108063) | Cod sursa (job #2602340) | Cod sursa (job #1962483) | Cod sursa (job #2430115)
#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;i++)
{
while(j && pattern[i] != pattern[j])
j = helper[j-1];
if(pattern[i]==pattern[j])
j++;
helper[i]=j;
}
}
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 if(maxim%patternSize == maxim)
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;
}