很简单的题目,算法早就看过,思维相当巧妙,刚好刷个模版。。。
ACcode:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=221000;
int n,d;
int p[MAXN];
char str[MAXN],c[MAXN];
int Min(int a1,int a2)
{
return a1<a2?a1:a2;
}
void init()
{
c[0]='$',c[1]='#';
n=strlen(str);
for (int i=0;i<n;i++)
c[i*2+2]=str[i],c[i*2+3]='#';
n=n+n+2;
}
int solve()
{
int mx=0,res=0,id;
for (int i=1;i<n-1;i++)
{
p[i]=mx>i?Min(p[id+id-i],mx-i):1;
for (;c[i-p[i]]==c[i+p[i]];p[i]++);
if (p[i]+i>mx) mx=p[i]+i,id=i;
if (p[i]>res) res=p[i];
}
return res-1;
}
int main()
{
while (scanf("%s",str)!=EOF)
{
init();
printf("%d\n",solve());
}
return 0;
}