天梯赛
LV2-008
Manacher算法
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
namespace Mana
{
int a[2010],b[2020];
int go(char s[])
{
int len=strlen(s+1);
a[0]=999;
memset(b,0,sizeof b);
for(int i=1;i<=len*2;i++)a[i]=i&1?1000:s[i/2];
a[len*2+1]=1000;
a[len*2+2]=1001;
int lim=0,id=0,ret=0;
for(int i=1;i<=len*2+1;i++)
{
if(lim>i)b[i]=min(b[2*id-i],lim-i);
else b[i]=1;
while(a[i-b[i]]==a[i+b[i]])b[i]++;
ret=max(ret,b[i]-1);
if(i+b[i])lim=i+b[i],id=i;
}
return ret;
}
}
char c[1010];
int main()
{
while(gets(c+1))
printf("%d\n",Mana::go(c));
}