Pagini recente » Cod sursa (job #1356524) | Cod sursa (job #2240847) | Cod sursa (job #1356530) | Cod sursa (job #2375040) | Cod sursa (job #1745217)
#include <iostream>
#include <fstream>
#include <string.h>
int T, i, l, rez, prim, ultim, pl, nr, maxl, st, dr;
char str [1000001];
int match[1000001];
using namespace std;
void kmp_match()
{
match[0]=0;
int j=0;
for(i=1;i<l;++i)
{
while(j>0 && (str[i]!=str[j]))
j=match[j-1];
if(str[i]==str[j])
++j;
match[i]=j;
}
}
int main ()
{
ifstream in ("prefix.in");
ofstream out ("prefix.out");
in>>T;
for(int c=0;c<T;++c)
{
for(i=0;i<1000002;++i)
{
str[i]=0;
match[i]=0;
}
//in.getline(str, 1000001, "\n");
in>>str;
//cout<<str<<endl;
l=strlen(str);
kmp_match();
//cout<<endl;
// for(int k=0;k<l;++k)
// cout<<match[k]<<" ";
//cout<<endl;
rez=0;
i=0;
nr=1;
maxl=0;
prim=0;
ultim=0;
while(i<l)
{
if(match[i]<match[i+1])
{
++nr;
++ultim;
}
else
{
if(nr>maxl)
{
maxl=nr;
st=prim;
dr=ultim;
}
nr=1;
prim=i+1;
ultim=i+1;
}
++i;
}
if(match[st+1])
{
if(match[st]!=0)
{
pl=st;
--st;
}
else
pl=st+1;
}
//pl=st+1;
//cout<<pl<<" "<<st<<" "<<dr;
rez=pl*((dr+1)/(st+1));
out<<rez<<"\n";
}
in.close();
out.close();
return 0;
}