Manacher算法

Posted st-lovaer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Manacher算法相关的知识,希望对你有一定的参考价值。

fl说今天是20200202,是个回文串,lzz应该整理一下回文串算法,于是整理一下马拉车。

很简单的回文字符串寻找算法,纯原创板子,返回信息最全,已过HDU上的板题,清除了上一次的残余信息而可多次调用。

 1 #include<bits/stdc++.h> 
 2 #define pf printf
 3 #define f(i,a,b) for(int i=a;i<=b;i++)
 4 using namespace std;
 5 const int maxn=110005;
 6 char ma[maxn];
 7 char tem[maxn<<1];
 8 int mp[maxn<<1];
 9 void manacher(char ma[],int mp[],int len,int &maxlen,int &maxstart,int &maxend){
10     maxlen=-1;
11     tem[0]=$;
12     tem[1]=#;
13     int l=2;
14     f(i,1,len){
15         tem[i<<1]=ma[i-1];
16         tem[(i<<1)+1]=#;
17     }
18     int maxright=0,id=0;
19     len=1+(len<<1);
20     tem[len+1]=;
21     f(i,0,len){
22         if(i<maxright){
23             if(maxright-i>mp[(id<<1)-i]){
24                 mp[i]=mp[(id<<1)-i];
25                 if(i+mp[i]>maxright){
26                     id=i;
27                     maxright=i+mp[i];
28                 }
29             }
30             else if(maxright-i<mp[(id<<1)-i]){
31                 mp[i]=maxright-i;
32                 if(i+mp[i]>maxright){
33                     id=i;
34                     maxright=i+mp[i];
35                 }
36             }
37             else{
38                 mp[i]=maxright-i;
39                 while(tem[i+mp[i]]==tem[i-mp[i]]){
40                     mp[i]++;
41                 }
42                 if(i+mp[i]>maxright){
43                     id=i;
44                     maxright=i+mp[i];
45                 }
46             }
47         }
48         else{
49             mp[i]=1;
50             while(tem[i+mp[i]]==tem[i-mp[i]]){
51                 mp[i]++;
52             }
53             if(i+mp[i]>maxright){
54                 id=i;
55                 maxright=i+mp[i];
56             }
57         }
58         if(mp[i]-1>maxlen){
59             maxlen=mp[i]-1;
60             maxstart=(i-maxlen)/2;
61         }
62     }
63     maxend=maxstart+maxlen-1;
64 }
65 int main(){
66     while(~scanf("%s",ma)){
67         int len=strlen(ma);
68         int maxstart,maxend,maxlen;
69         manacher(ma,mp,len,maxlen,maxstart,maxend);
70         pf("%d
",maxlen);
71 //        f(i,maxstart,maxend){
72 //            pf("%c",ma[i]);
73 //        }
74 //        pf("
");
75     }
76 }

 

以上是关于Manacher算法的主要内容,如果未能解决你的问题,请参考以下文章

Manacher 入门+模板 回文串专用算法

最长回文子串---Manacher算法

什么是Manacher(马拉车)算法-java代码实现

P3805 模板manacher算法(马拉车)

[BZOJ3676][APIO2014]回文串(Manacher+SAM)

Manacher算法详解