#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 110005
char str[N], str1[2*N];
int len;
//将输入的字符串转化为str1,使得str1的每个回文子串长度都变为奇数
//方法:在每个字符两边都插入一个特殊字符
//另外在串的开始加入另一个特殊字符, 可以避免对数组越界问题做特殊处理
void Build()
{
int i=0, j;
str1[0]='@';//开始加入另特殊字符
str1[1]='#';
j=2;
for(i=0; i<len; i++ )//在每个字符两边都插入一个特殊字符
{
str1[j++]=str[i];
str1[j++]='#';
}
str1[j]='\0';
}
int main()
{
int i, j, mx, id, p[2*N];
int maxx=0, record=0;
while( scanf("%s", str )!=EOF )
{
maxx=0;
len=strlen(str);
Build();
//mx=id+p[id],表示在以id为中心的回文右边界
mx=0;
memset(p, 0, sizeof(p));
for(i=1; str1[i]!='\0'; i++)
{
if( mx>i )
p[i]=min(mx-i, p[2*id-i]);
else p[i]=1;
while( str1[i+p[i]]==str1[i-p[i]] )//扩展p[i]
p[i]++;
if( i+p[i]>mx )
{
mx=i+p[i];
id=i;
}
if( p[i]>maxx)
{
maxx=p[i]-1;//P[id]-1就是该回文子串在原串中的长度
record=i;
}
}
printf("%d\n", maxx);
}
}
hdu 3068最长回文子串(manacher算法)
最新推荐文章于 2024-03-27 17:10:36 发布