版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/86776629
题目
https://www.luogu.org/problemnew/show/P3805
解题思路
马拉车算法(Manacher’s algorithm)是一个求一个字符串中最长回文连续子序列的算法。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
char s[55000001],a[11000001];
int hw[55000001],n,ans=1;
inline void change(){
rep(i,0,n-1) s[(i<<1)+2]=a[i],s[(i<<1)+3]='#';
s[0]=s[1]='#'; n=(n<<1)+2;
}
inline void manacher(){
int maxright=0,mid;
rep(i,1,n-1) {
hw[i]=(i<maxright)?min(hw[(mid<<1)-i],hw[mid]+mid-i):1;
while (s[i+hw[i]]==s[i-hw[i]]) hw[i]++;
if (hw[i]+i>maxright) maxright=hw[i]+i,mid=i;
}
}
int main(){
scanf("%s",a); n=strlen(a);
change(),manacher();
rep(i,0,n-1) ans=max(ans,hw[i]);
return 0&printf("%d",ans-1);
}