标签:namespace 扩展 def col else bsp math max code
//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; }
标签:namespace 扩展 def col else bsp math max code
原文地址:https://www.cnblogs.com/water-radish/p/9280610.html