hdu3068 最长回文 马拉车模板题
马拉车算法模板题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int maxn=110010; char s[maxn<<1],ne[maxn<<1]; int p[maxn<<1],mx,maxx; int init(){ int len=strlen(s),j=0; ne[0]='$'; ne[1]='#'; j=2; for(int i=0;i<len;i++) { ne[j++]=s[i]; ne[j++]='#'; } ne[j]='\0'; return j; } int Manacher(){ int len=init(); int id; mx=0; for(int i=1;i<=len;i++) { if(i<mx){ p[i]=min(p[2*id-i],mx-i); }else p[i]=1; while(ne[i-p[i]]==ne[i+p[i]])p[i]++; if(mx<i+p[i]){ mx=i+p[i]; id=i; } maxx=max(maxx,p[i]); } return maxx; } int main(){ while(scanf("%s",s)!=EOF){ maxx=0; Manacher(); cout<<maxx-1<<endl; } }
——愿为泰山而不骄
qq850874665~~