首页 > 其他 > 详细

NC200546 回文串

时间:2020-02-02 09:46:20      阅读:99      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

Code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3  
 4 void manacher(string &ss, vector<int> &leftPart){
 5     vector<int> t(ss.size(),0);
 6     int middle=0;
 7     int rightBound=0;
 8     int len=ss.size();
 9      
10     for(int i=1;i<len;++i){
11         if(i<rightBound){
12             int left=middle-(i-middle);
13             t[i]=min(rightBound-i, t[left]);
14         }
15         while(i+t[i]<len && i-t[i]>=0 && ss[i+t[i]]==ss[i-t[i]]){
16             if(ss[i+t[i]]==#) leftPart[i+t[i]]=max(leftPart[i+t[i]],t[i]);
17             else leftPart[i+t[i]]=max(leftPart[i+t[i]],t[i]+1);
18              
19             ++t[i];
20         }
21         --t[i];
22         if(i+t[i]>rightBound){
23             rightBound=i+t[i];
24             middle=i;
25         }
26     }
27 }
28  
29 int main(){
30     string s;
31     cin>>s;
32     int N=s.size();
33     if(N<2) {
34         cout<<"0"<<endl;
35         return 0;
36     }
37      
38     int res=2;
39     string ss="";
40     for(int i=0;i<(int)s.size();++i){
41         ss+="#";
42         ss+=s[i];
43     }
44     ss+="#";
45     int M=ss.size();
46     vector<int> leftPart(M,0);
47     vector<int> rightPart(M,0);
48     for(int i=0;i<M;++i){
49         if(ss[i]==#){
50             leftPart[i]=0;
51             rightPart[i]=0;
52         }else{
53             leftPart[i]=1;
54             rightPart[i]=1;
55         }
56     }
57      
58     manacher(ss,leftPart);
59     string reverses="";
60     for(int i=M-1;i>=0;--i){
61         reverses+=ss[i];
62     }
63     manacher(reverses,rightPart);
64     for(int i=1;i<M;i++){
65         leftPart[i]=max(leftPart[i],leftPart[i-1]);
66         rightPart[i]=max(rightPart[i],rightPart[i-1]);
67     }
68     for(int i=1;i<M-1;++i){
69         if(ss[i]==#)    res=max(res,leftPart[i]+rightPart[M-1-i]);
70     }
71     cout<<res<<endl;
72     return 0;
73 }

 

NC200546 回文串

原文:https://www.cnblogs.com/FEIIEF/p/12251005.html

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