https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
相关问题
约束性较大基本上用于求最大回文串字符 N(o)复杂度。
字符串分为奇偶串,但预处理一下可以全部变为奇串。在每两各自符之间加一个特殊符号,最前面需要加字符因为有越界情况。
(2×id-i)时可能越界。
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<iostream>
const int maxn =1000010;
using namespace std;
char new_l[maxn<<1];
char old_l[maxn];
int p[maxn<<1];
int manacher()
{
int i,id=0,mx=0;//mx表示以id为中心的回文串的右边长度
int max_len=0;
for(i=1;new_l[i];i++)
{
if(mx>i) p[i]=min(p[2*id-i],mx-i);//因为回文串的长度如果小于最大回文串的,(2*id-i)表示与i关于id对称的字符串的长度,而此时的长度最少等于d[2*id-i];
else p[i]=1;
while(new_l[i-p[i]]==new_l[i+p[i]]) p[i]++;
if(mx<i+p[i])//i表示位置而p[i]为回文串的一边的长度,如果越界了暴力求解
{
mx=i+p[i];
id=i;
}
max_len=max(max_len,p[i]-1);
}
cout<<max_len<<endl;
return 0;
}
int main()
{
cin>>old_l;
int j=2;
int len=strlen(old_l);
new_l[0]='$';
new_l[1]='#';
for(int i=0;i<len;i++)
{
new_l[j++]=old_l[i];
new_l[j++]='#';
}
new_l[j]='\0';
manacher();
return 0;
}
https://blog.csdn.net/dyx404514/article/details/42061017这个大佬博客有详细图片