Pagini recente » Cod sursa (job #1975795) | Borderou de evaluare (job #3031567) | Cod sursa (job #2540273) | Borderou de evaluare (job #2965877) | Cod sursa (job #2306452)
#include <fstream>
#include <string>
#include <vector>
#define lim 1000004
using namespace std;
ifstream f("prefix.in");
ofstream g("prefix.out");
int t,pre[lim],lm,maxim;
string s;
vector <int> fr[lim];
void prefix (void)
{
int j=0;
for (int i=2;i<=s.length();i++)
{
while (j && s[j+1]!=s[i]) j=pre[j];
if (s[j+1]==s[i]) j++;
pre[i]=j;
}
}
int main()
{
f>>t;
while (t--)
{
f>>s;
int ns=s.length();
maxim=0;
for (int i=ns-1;i>=0;i--) s[i+1]=s[i];
for (int i=1;i<=ns;i++) pre[i]=0;
prefix();
for (int l=1;l<ns;l++)
{
int j=0;
for (int i=l+1;i<=ns;i++)
{
while (j && s[j+1]!=s[i]) j=pre[j];
if (s[j+1]==s[i]) j++;
if (j==l)
{
j=pre[j];
fr[l].push_back(i);
}
}
}
for (int l=1;l<ns;l++)
{
int verif=2*l,ok=1,currmax=0,hasfr=0;
for (auto i:fr[l])
{
hasfr=1;
if (i!=verif)
{
ok=0;
break;
}
verif+=l;
}
verif-=l;
if (hasfr)
{
if (verif>maxim) maxim=verif;
}
fr[l].clear();
}
g<<maxim<<'\n';
}
f.close();
g.close();
return 0;
}