hdu3068 最长回文
考点
- manacher
题意
hdu链接
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.(就是原题XD)
思路
裸的manacher题目,博主刚学manacher
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxnode=220100;
/*manacher*/
int MaxRight;
int pos;
int RL[maxnode*2+3];
int ans;
char input[maxnode];//原始输入
char str[maxnode*2+3];//转化后字符串
int main()
{
int j,i,len;
while(scanf("%s",&input)!=EOF)
{
/*init*/
len=strlen(input);
MaxRight=0;
ans=0;
pos=0;
str[0]='*';//防止数组越界
for(i=0;i<=len;++i)//插入#号
{
str[(i<<1)+1]='#';
str[(i<<1)+2]=input[i];
}
for(i=2;i<2*len+1;++i)
{
MaxRight=RL[pos]+pos;
if(MaxRight>=i)
{
j=2*pos-i;
RL[i]=min(MaxRight-i,RL[j]);
/*如果i为中心的回文串超过了MaxRight*/
/*就只能成为MaxRight-i了*/
}
else RL[i]=1;
while(str[i+RL[i]]==str[i-RL[i]])//扩展ing...
++RL[i];
if(MaxRight<i+RL[i]) pos=i;
if(ans<RL[i]) ans=RL[i];
}
printf("%d\n",ans-1);
}
}