Pagini recente » Cod sursa (job #707375) | Cod sursa (job #1628202) | Cod sursa (job #2934654) | Cod sursa (job #2403259) | Cod sursa (job #2578956)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");
int t;
char a [1000001];
int pi [1000001];
int perioada[1000001];
void calculeazaPI()
{
int i,j;
pi[0]=0;
j=0;
i=1;
while(a[i])
{
if(a[i]==a[j])
pi[i++]=++j;
else if(j)
j=pi[j-1];
else
pi[i++]=0;
}
}
int solve()
{
calculeazaPI();
int longest=0;
for(int i=0;a[i];i++)
{
perioada[i]=0;
int lungime = i-pi[i]+1;
if(pi[i]==0)
perioada[i]=0;
else if(pi[i]*2 == i+1 + perioada[pi[i]-1] * lungime)
{
perioada[i]=perioada[pi[i]-1]+1;
longest=max(longest,lungime*(perioada[i]+1));
}
}
return longest;
}
int main()
{
f>>t;
for(int i=1;i<=t;i++)
{
f>>a;
g<<solve()<<'\n';
}
f.close();
g.close();
return 0;
}