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 }

 

 

 

 

posted @ 2020-03-20 11:41  sewage  阅读(174)  评论(0编辑  收藏  举报