马拉车算法的原理这里不再叙述,这里贴上马拉车求最长回文子串的板子,其实马拉车可以把本质不同的回文串都找出来的
回文自动机其实也可以完成同样的事情
对字符串里面的特殊字符没有限制,什么情况都可以求
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 7 const int maxn=100005; 8 char ma[maxn*2]; 9 int mp[maxn*2]; 10 void manacher(char s[],int len) 11 { 12 int l=0; 13 ma[l++]='$'; 14 ma[l++]='#'; 15 for(int i=0;i<len;i++) 16 { 17 ma[l++]=s[i]; 18 ma[l++]='#'; 19 } 20 ma[l]=0; 21 int mx=0,id=0; 22 for(int i=0;i<l;i++) 23 { 24 mp[i]=mx>i?min(mp[2*id-i],mx-i):1; 25 while(ma[i+mp[i]]==ma[i-mp[i]]&&(i-mp[i]>0))mp[i]++; 26 if(i+mp[i]>mx) 27 { 28 mx=i+mp[i]; 29 id=i; 30 } 31 32 } 33 } 34 char s[maxn]; 35 int main() 36 { 37 //scanf("%s",s); 38 gets(s); 39 int len=strlen(s); 40 manacher(s,len); 41 int ans=0; 42 for(int i=1;i<2*len+2;i++) 43 ans=max(ans,mp[i]-1); 44 printf("%d\n",ans); 45 return 0; 46 }