题目链接
#include<bits/stdc++.h> using namespace std; int t; string s; int q[2000006]; char ss[2000006]; int manacher(string a) { int len=a.size(); int now=0; for(int i=0;i<len;i++) { ss[now++]='&'; ss[now++]=a[i]; } ss[now++]='&'; ss[now]=0; //处理字符串 q[0]=1; int ct=0; int r=0; int ans=0;//从端点开始的最长回文串半径 for(int i=1;i<now;i++) { if(i<r) q[i]=min(q[2*ct-i],r-i); else q[i]=1; while(i-q[i]>=0&&i+q[i]<now&&ss[i-q[i]]==ss[i+q[i]]) { q[i]++; } if(q[i]+i>r) { r=q[i]+i; ct=i; } if(i-q[i]+1==0) { ans=max(ans,q[i]); } } return ans-1; } int main() { cin.sync_with_stdio(false); cin>>t; while(t--) { cin>>s; int len=s.size(); int minl=0; for(int i=0;i<len-1-i;i++) { if(s[i]==s[len-i-1]) minl++; else break; } int a1=manacher(s.substr(minl,len-2*minl)); string t=s.substr(minl,len-2*minl); reverse(t.begin(),t.end()); int a2=manacher(t); cout<<s.substr(0,minl); if(a1>0&&a2>0&&a1>=a2) { cout<<s.substr(minl,a1); } else if(a1>0&&a2>0) { string t=s.substr(minl,len-2*minl); reverse(t.begin(),t.end()); cout<<t.substr(0,a2); } cout<<s.substr(len-minl)<<endl; } return 0; }
Prefix-Suffix Palindrome (Manacher算法)
最新推荐文章于 2020-07-31 20:41:05 发布