马拉车算法(Manacher)求最长回文子串

马拉车算法的原理这里不再叙述,这里贴上马拉车求最长回文子串的板子,其实马拉车可以把本质不同的回文串都找出来的

回文自动机其实也可以完成同样的事情

对字符串里面的特殊字符没有限制,什么情况都可以求

 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 }

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9636515.html