Codeforces Global Round 7D(马拉车/PAM,回文串)

Posted ldudxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<<"
";
49     }
50     return 0;
51 }

 

 

 

 

以上是关于Codeforces Global Round 7D(马拉车/PAM,回文串)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Global Round 7 题解(未完)(ABCD)

Codeforces Global Round 7 总结

Codeforces Global Round 7

Codeforces Global Round 7 题解

Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version) -- manacher

Codeforces Global Round 7 D2. Prefix-Suffix Palindrome (Hard version)(Manacher算法+输出回文字符串)