题意:就是寻找给定字符串的最长回文串的长度
思路:Manacher算法直接用就可以了,算法讲解
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 110005
using namespace std;
char str[maxn];
char tmp[maxn<<1];//转换后的字符串
int r[maxn<<1];//记录回文串的半径
int Init()
{
int len=strlen(str);
tmp[0]='$'; //字符串开头增加一个特殊字符,防止越界
tmp[1]='#';
int j=2;
for(int i=0;i<len;i++)
{
tmp[j++]=str[i];
tmp[j++]='#';
}
tmp[j]='\0';
return j; //返回转换后字符串的长度
}
int Manacher()
{
int len=Init();
int maxlen=-1;
int pos;
int mx=0; //回文串右端点位置
for(int i=1;i<len;i++)
{
if(i<mx)
r[i]=min(r[2*pos-i],mx-i);
else
r[i]=1;
while(tmp[i-r[i]]==tmp[i+r[i]]) //向外扩大半径
r[i]++;
if(mx<i+r[i]) //更新中心点的值和右端点位置
{
pos=i;
mx=i+r[i];
}
maxlen=max(maxlen,r[i]-1);
}
return maxlen;
}
int main()
{
while(scanf("%s",str)!=EOF)
{
printf("%d\n",Manacher());
}
return 0;
}