题意:
取一字符串不相交的前缀和后缀(可为空)构成最长回文串。
思路:
先从两边取对称的前后缀,之后再取余下字符串较长的回文前缀或后缀。
#include <bits/stdc++.h> using namespace std; bool ok(const string &s,int l,int r){ while(l<=r&&s[l]==s[r]) ++l,--r; return l>r; } void solve(){ string s;cin>>s; int l=0,r=s.size()-1; while(l<r&&s[l]==s[r]) ++l,--r; int r2,l2; for(r2=r;r2>=l;r2--) if(ok(s,l,r2)) break; for(l2=l;l2<=r;l2++) if(ok(s,l2,r)) break; cout<<s.substr(0,l) <<((r2-l>r-l2)?s.substr(l,r2-l+1):s.substr(l2,r-l2+1)) <<s.substr(r+1) <<" "; } int main() { int t;cin>>t; while(t--) solve(); return 0; }