Cod sursa(job #1207779)
| Utilizator | Data | 13 iulie 2014 20:59:14 | |
|---|---|---|---|
| Problema | Prefix | Scor | 90 |
| Compilator | cpp | Status | done |
| Runda | Arhiva de probleme | Marime | 0.89 kb |
#include<fstream>
#include<cstring>
using namespace std;
const int NMAX=1000005;
int t,dp[NMAX];
char s[NMAX];
int main()
{
int i,len,maxim,dr;
ifstream fin("prefix.in");
ofstream fout("prefix.out");
fin>>t;
while (t--)
{
fin>>(s+1);
len=strlen(s+1);
dp[1]=0;maxim=0;
for (i=2;i<=len;i++)
{
if (s[dp[i-1]+1]==s[i]) dp[i]=dp[i-1]+1;
else
{
dr=dp[i-1];
while (dr && s[dr+1]!=s[i]) dr=dp[dr];
dp[i]=0;
if (s[dr+1]==s[i]) dp[i]=dr+1;
}
if (dp[i]>=(i/2) && i%(i-dp[i])==0) maxim=max(maxim,i);
}
fout<<maxim<<"\n";
}
return 0;
}
