首页 > 编程语言 > 详细

A ABB 马拉车算法

时间:2020-10-02 13:47:15      阅读:44      评论:0      收藏:0      [点我收藏+]

题意:给出一个字符串,让我们通过从右边+字符的方式来让这个字符串成为回文串  

   问最少用多少字符能使其成为回文串

思路:利用马拉车算法,在每个字符间补‘#’(防止考虑不到abba这种回文类型)

   然后跑一遍求出len值

   在枚举每个位置为中心点的情况,枚举出最优值即可

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int inf = 0x3f3f3f3f;
 4 const int maxx = 3e6+10;
 5 char tmp[maxx];
 6 int len[maxx];
 7 int ans=inf;
 8 void Manacher(string s)
 9 {
10     tmp[0]=$;
11     tmp[1]=#;
12     int t=s.size();
13     for(int i=0;i<2*t+5;i++)len[i]=0;
14     for(int i=1;i<=t;i++){
15         tmp[2*i]=s[i-1];
16         tmp[2*i+1]=#;
17     }
18     tmp[2*t+2]=\0;
19     int mx=0;
20     int mid;
21     for(int i=1;tmp[i];i++){
22         if(i<mx)len[i]=min(len[2*mid-i],mx-i);
23         else len[i]=1;
24         while(tmp[i-len[i]]==tmp[i+len[i]])len[i]++;
25         if(len[i]+i>mx){
26             mx=len[i]+i;
27             mid=i;
28         }
29         int l=len[i]-1;
30         if(i%2==0){
31             l=(l-1)/2;
32             int p=i/2;
33             if(p+l==t){
34                 ans=min(ans,p-l-1);
35             }
36         }
37         else{
38             l=l/2;
39             int p=(i-1)/2,q=(i+1)/2;
40             if(q+l-1==t){
41                 ans=min(ans,p-l);
42             }
43         }
44     }
45 }
46 int main()
47 {
48     int n;
49     cin>>n;
50     string s;
51     cin>>s;
52     Manacher(s);
53     cout<<ans<<endl;
54     return 0;
55 }

 

   

A ABB 马拉车算法

原文:https://www.cnblogs.com/pangbi/p/13760460.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!