Codeforces Global Round 7D(马拉车/PAM,回文串)
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int maxi,R,pos,ans_pos,p[2000007]; 5 string str,ans_str,tmp; 6 void Manacher(string s){//马拉车模板,p数组存放当前位置为轴回文串的最大长度 7 int siz=s.size(); 8 memset(p,0,sizeof(int[siz])); 9 R=pos=0; 10 for(int i=1;i<siz;++i){ 11 if(i<R) 12 p[i]=min(p[2*pos-i],R-i); 13 else 14 p[i]=1; 15 while(i-p[i]>=1&&i+p[i]<siz&&s[i-p[i]]==s[i+p[i]]) 16 ++p[i]; 17 if(i+p[i]>R) 18 R=i+p[i],pos=i; 19 } 20 } 21 int main(){ 22 ios::sync_with_stdio(false); 23 cin.tie(NULL); 24 cout.tie(NULL); 25 int t; 26 cin>>t; 27 while(t--){ 28 maxi=0; 29 cin>>str; 30 int siz=str.size(),pnt=0; 31 while(pnt<siz-1-pnt&&str[pnt]==str[siz-1-pnt]) 32 ++pnt; 33 tmp="%#"; 34 for(int i=pnt;i<siz-pnt;++i) 35 tmp+=str[i],tmp+='#'; 36 Manacher(tmp); 37 int tmp_siz=tmp.size(); 38 for(int i=1;i<tmp_siz;++i) 39 if((i-p[i]==0||i+p[i]==tmp_siz)&&p[i]>maxi) 40 maxi=p[i],ans_pos=i;//找到最长的回文串长度及轴的位置 41 ans_str=""; 42 for(int i=0;i<pnt;++i) 43 ans_str+=str[i]; 44 for(int i=ans_pos-p[ans_pos]+1+1;i<=ans_pos+p[ans_pos]-1;i+=2) 45 ans_str+=tmp[i]; 46 for(int i=pnt-1;i>=0;--i) 47 ans_str+=str[i]; 48 cout<<ans_str<<"\n"; 49 } 50 return 0; 51 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)