Manacher

Manachers算法是一个可求字符串的最长回文穿的高效率算法

优点:速度高

这是一篇清晰移动的博客:传送

代码实现:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=2e5;
 5 
 6 string Mnc(string &s)
 7 {
 8     string t="$#";
 9     for(int i=0;i<s.length();++i)//構造輔助串
10     {
11         t+=s[i];
12         t+='#';
13     }
14 
15     int ml=0,p=0,R=0,M=0;
16     //最大長度,最長迴文中心,當前最大迴文串右端,當前最長迴文中心
17     
18     int len=t.length();
19     vector<int> P(len,0);//迴文長度數組
20     for(int i=0;i<len;++i)
21     {
22         P[i]=R>i?min(P[2*M-i],R-i):1;//轉移方程
23         
24         while(t[i+P[i]]==t[i-P[i]])//長度擴張
25             ++P[i];
26 
27         if(i+P[i]>R)//更新右端和中心
28         {
29             R=i+P[i];
30             M=i;
31         }
32         if(ml<P[i])//記錄極大
33         {
34             ml=P[i];
35             p=i;
36         }
37     }
38 
39     return s.substr((p-ml)/2,ml-1);//返回迴文串
40 }
41 
42 int main()
43 {
44     string a;
45     while(cin>>a)
46         cout<<Mnc(a)<<endl;
47 }

 

posted @ 2018-12-05 22:41  Lin88  阅读(148)  评论(0编辑  收藏  举报