解题报告: 这题真不会。。看了别人的思路就是把奇偶不同的字母分为两类,然后排序,假设两个字符串是a和b ,这样我们检查a+b 是否合法,或者b+a是否合法,如果都不合法就没机会了,不难发现 a和b内部的差值都是偶数,一定是合法的,只需要check 两个字符串连接的地方是否是合法的就行了。
#include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<map> #include<set> using namespace std; typedef long long ll; const int N=1010; const int mod=1e9+7; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int res; int n,k; ll f[210][10]; //考虑前i个 最多喝了j瓶药的最大积分 int m; struct node{ ll a; ll b; ll c; }q[N]; int main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int t; cin>>t; while(t--) { string s; cin>>s; string s1,s2; for(int i=0;i<s.size();i++) { if(s[i]&1) s1+=s[i]; else s2+=s[i]; } sort(s1.begin(),s1.end()); sort(s2.begin(),s2.end()); // cout<<s1<<' '<<s2<<endl; if(abs(s2[0]-s1[s1.size()-1]) !=1){ cout<<s1+s2<<endl; } else if(abs(s2[s2.size()-1]-s1[0])!=1 ) cout<<s2+s1<<endl; else cout<<"No answer"<<endl; } return 0; }