Manacher(马拉车算法)
Posted water-radish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Manacher(马拉车算法)相关的知识,希望对你有一定的参考价值。
//Manacher //可求最长回文子串长度 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define ma 11000005 using namespace std; int n,ans,length[ma<<1]; //n为字符串长度 length[i]表示以i点为中心端点的回文子串长度+1 char a[ma],s[ma<<1]; void Init() { s[0]=‘$‘; for(int i=1;i<=n+1;i++) { s[2*i-1]=‘#‘; s[2*i]=a[i-1]; } n=n*2+2; } void manacher() { int mxr=0,mid=0;//mxr为目前最长回文子串的右端点 mid为mxr对应回文子串的中点 for(int i=1;i<n;i++) { if(i<mxr)//该点被回文子串包含 length[i]=min(mxr-i,length[2*mid-i]); else length[i]=1; while(s[i-length[i]]==s[i+length[i]])//扩展 { length[i]++; if(length[i]+i>mxr) { mxr=length[i]+i; mid=i; } } } } int main() { scanf("%s",a); n=strlen(a); Init(); manacher(); for(int i=0;i<n;i++) ans=max(ans,length[i]); printf("%d",ans-1); return 0; }
以上是关于Manacher(马拉车算法)的主要内容,如果未能解决你的问题,请参考以下文章