R->S P->R S->P Bob 次数A B C w=min(A,b)+min(B,c)+min(C,a) w2<n 不行 直接遍历Bob 只要Alice有能攻击它的就构造序列 不够的空上 绝对w2>=n 就剩余谁多随便填了
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; typedef long long ll; const ll mod=1e9+7; #define rep(i,a,n) for(int i=a;i<=n;i++) #define pb push_back ll n,t; ll a,b,c; string s,ans; ll num(ll x){ ll cnt=0; for(int i=0;i<=31;i++){ if(x&(1<<i)){ cnt++; } } cout<<cnt<<endl; } int main(){ cin>>t; while(t--){ ans=""; cin>>n>>a>>b>>c; cin>>s; vector<ll> count(26); for(int i=0;i<n;i++){ count[s[i]-'A']++; //统计Bob数量 } ll w=min(a,count['S'-'A'])+min(b,count['R'-'A'])+min(c,count['P'-'A']); if(w*2<n){ cout<<"NO"<<endl; continue; } cout<<"YES"<<endl; for(int i=0;i<n;i++){ if(s[i]=='R' && b){ ans+='P'; b--; } else if(s[i]=='P' && c){ c--; ans+='S'; } else if(s[i]=='S' && a){ ans+='R'; a--; } else ans+='-'; } for(int i=0;i<n;i++){ if(ans[i]=='-'){ if(a){ ans[i]='R'; a--; } else if(b){ ans[i]='P'; b--; } else{ ans[i]='S'; c--; } } } cout<<ans<<endl; } return 0; } /* */