Pagini recente » Rating Andrei Birsan (birsan) | Cod sursa (job #1187381) | Cod sursa (job #2019443) | Cod sursa (job #253374) | Cod sursa (job #1162176)
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
string s;
int nt,it,mij,mij2,dr,dr2,coresp,equiv,i,z[1000006],mx,l;
int main(void)
{
ifstream f("prefix.in");
ofstream g("prefix.out");
f>>nt;
for (it=1;it<=nt;it++)
{
f>>s;
memset(z,0,sizeof(z));
s.push_back('*');
mx=0;
mij=dr=-1;
for (i=1;i<s.size();i++)
{
if (i>=dr)
{
mij=i;
dr=i;
coresp=0;
while (s[dr]==s[coresp])
{
dr++;
coresp++;
}
dr--;
z[i]=coresp;
}
else
{
mij2=i;
equiv=i-mij;
dr2=min(dr,i+z[equiv]);
coresp=dr2-mij2;
while (s[dr2]==s[coresp])
{
dr2++;
coresp++;
}
z[i]=coresp;
if (dr2>dr)
{
dr=dr2;
mij=mij2;
}
}
if (z[i]>=i)
{
l=i+z[i]-z[i]%i;
if (l>mx)
mx=l;
}
}
g<<mx<<'\n';
}
g.close();
return 0;
}