A ABB 马拉车算法
题意:给出一个字符串,让我们通过从右边+字符的方式来让这个字符串成为回文串
问最少用多少字符能使其成为回文串
思路:利用马拉车算法,在每个字符间补‘#’(防止考虑不到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 }