传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3068
基础manacher的应用
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 210010;
char str[N];
char a[N];
int p[N];
void manacher(int cnt)
{
memset(p,0,sizeof(p));
int maxid=0;
int maxl=0;
int id;
for(int i=1;i<cnt;i++)
{
if(maxid>i)
{
p[i]=min(p[2*id-i],maxid-i);
}
else
{
p[i]=1;
}
while(str[p[i]+i]==str[i-p[i]])
{
p[i]++;
}
if(p[i]+i>maxid)
{
maxid=p[i]+i;
id=i;
}
if(p[i]-1>maxl)
{
maxl=p[i]-1;
}
}
printf("%d\n",maxl);
}
int main()
{
while(~scanf("%s",a))
{
int len=strlen(a);
int cnt=2;
for(int i=0;i<len;i++)
{
str[cnt++]=a[i];
str[cnt++]='#';
}
str[0]='?';
str[1]='#';
str[cnt]=0;
manacher(cnt);
}
return 0;
}