最长对称子串
题目描述
给定一个字符串 S,请你求出 S 的最长回文子串。
输入描述
输入仅一行,包含一个字符串 S。
1≤∣S∣≤5×105,保证 S 只包含小写字母、大写字母、数字。
输出描述
输出共 11 行,包含一个整数,表示答案。
输入样例
aa1ABA1b
输出样例
5
解题思路
典型的马拉车算法。详解请看Manacher算法详细解析 (马拉车算法)
代码
#include<stdio.h>
char ostr[500005];
char str [1000010]; //存放插入符号的新字符
int v[1000010];
int main(){
scanf("%s",ostr);
//初始化数组
str[0]='@';
str[1]='#';
//重新构造数组
int k;
for(k=0;ostr[k]!='\0';k++){
str[2*k+2]=ostr[k];
str[2*k+3]='#';
}
str[2*k+2]='\0';
int r=0,mid=0;
for(int i=1;str[i]!='\0';i++){
if(i<r){
if(v[2*mid-i]>r-i)
v[i]=r-i;
else
v[i]=v[2*mid-i];
}
else v[i]=1;
//计算超出最长对称字串范围的字符
while(str[i+v[i]]==str[i-v[i]])
v[i]++;
//更新最长臂长以及对称字符串中点
if(i+v[i]>r){
r=i+v[i];
mid=i;
}
}
int max=-1;
for(int i=1;i<2*k+2;i++){
if((v[i]-1)>max)
max=v[i]-1;
}
printf("%d",max);
return 0;
}