QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#290497#4859. Poker Game: Constructionucup-team1134#AC ✓838ms6160kbC++2026.0kb2023-12-25 04:34:072023-12-25 23:53:08

Judging History

你现在查看的是最新测评结果

  • [2023-12-25 23:53:08]
  • 管理员手动重测该提交记录
  • 测评结果:AC
  • 用时:838ms
  • 内存:6160kb
  • [2023-12-25 04:34:07]
  • 评测
  • 测评结果:0
  • 用时:821ms
  • 内存:6068kb
  • [2023-12-25 04:34:07]
  • 提交

answer

// https://codeforces.com/gym/103914/submission/171747570



// https://onlinejudge.u-aizu.ac.jp/solutions/problem/2535/review/4576753/syl659/C++11
// https://judge.yosupo.jp/submission/21682
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=998244353,MAX=15;
const int INF=1<<30;
//const ll INF=1LL<<60;

string suits = "CDHS";
string ranks = "23456789TJQKA";
int str2int(string s){
    int res = 0;
    for(int i=0; i<4; i++){
        if(s[1]==suits[i]) res += i*13;
    }
    for(int i=0; i<13; i++){
        if(s[0]==ranks[i]) res += i;
    }
    return res;
}

int getint(string &s){
    if(s[0]=='T') return 8;
    if(s[0]=='J') return 9;
    if(s[0]=='Q') return 10;
    if(s[0]=='K') return 11;
    if(s[0]=='A') return 12;
    return (int)(s[0]-'2');
}

vector<int> highest_hand_without_flush(vector<int> a){
    vector<int> c(13,false);
    vector<int> ranks(13, 0);
    for(int i=0; i<(int)a.size(); i++){
        int rank = a[i];
        c[rank] = true;
        ranks[rank]++;
    }
    vector<vector<int>> n2r(5);
    for(int i=12; i>=0; i--){
        n2r[ranks[i]].push_back(i);
    }
    // フォーカード
    if(!n2r[4].empty()){
        for(int i=12; i>=0; i--){
            if(ranks[i]==0 or i==n2r[4][0]) continue;
            return {7, n2r[4][0], i};
        }
    }
    // フルハウス
    if(!n2r[3].empty() and (n2r[3].size() +n2r[2].size())>=2u){
        for(int i=12; i>=0; i--){
            if(i==n2r[3][0] or ranks[i]<2) continue;
            return {6, n2r[3][0], i};
        }
    }
    // ストレート
    for(int i=12; i>=3; i--){
        bool ok = true;
        for(int j=0; j<5; j++){
            int rank = (i-j>=0)? i-j: 12;
            if(ranks[rank] == 0){
                ok = false;
                break;
            }
        }
        if(ok) return {4, i};
    }
    // スリーカード
    if(!n2r[3].empty()){
        return {3, n2r[3][0], n2r[1][0], n2r[1][1]};
    }
    // ツーペア
    if((int)n2r[2].size() >= 2){
        int rem = (n2r[2].size()>2u)? max(n2r[2][2], n2r[1][0]): n2r[1][0];
        return {2, n2r[2][0], n2r[2][1], rem};
    }
    // ワンペア
    if((int)n2r[2].size() == 1){
        return {1, n2r[2][0], n2r[1][0], n2r[1][1], n2r[1][2]};
    }
    vector<int> res{0};
    res.insert(res.end(), n2r[1].begin(), n2r[1].begin()+5);
    return res;
}

vector<int> highest_hand(vector<string> aa){
    vector<int> a;
    for(auto x:aa){
        a.push_back(str2int(x));
    }
    vector<vector<bool>> c(4, vector<bool>(13, false));
    vector<int> suits(4, 0);
    vector<int> ranks(13, 0);
    for(int i=0; i<(int)a.size(); i++){
        int suit = a[i]/13;
        int rank = a[i]%13;
        c[suit][rank] = true;
        suits[suit]++;
        ranks[rank]++;
    }
    vector<vector<int>> n2r(5);
    for(int i=12; i>=0; i--){
        n2r[ranks[i]].push_back(i);
    }
    
    for(int i=0; i<4; i++){
        for(int j=12; j>=3; j--){
            bool ok = true;
            for(int k=0; k<5; k++){
                int rank = (j-k>=0)? j-k: 12;
                if(!c[i][rank]){
                    ok = false;
                    break;
                }
            }
            if(ok) return {8, j};
        }
    }
    // フォーカード
    if(!n2r[4].empty()){
        for(int i=12; i>=0; i--){
            if(ranks[i]==0 or i==n2r[4][0]) continue;
            return {7, n2r[4][0], i};
        }
    }
    // フルハウス
    if(!n2r[3].empty() and (n2r[3].size() +n2r[2].size())>=2u){
        for(int i=12; i>=0; i--){
            if(i==n2r[3][0] or ranks[i]<2) continue;
            return {6, n2r[3][0], i};
        }
    }
    // フラッシュ
    for(int i=0; i<4; i++){
        if(suits[i] < 5) continue;
        vector<int> res{5};
        for(int j=12; j>=0; j--){
            if(c[i][j]) res.push_back(j);
            if((int)res.size() == 6) return res;
        }
    }
    // ストレート
    for(int i=12; i>=3; i--){
        bool ok = true;
        for(int j=0; j<5; j++){
            int rank = (i-j>=0)? i-j: 12;
            if(ranks[rank] == 0){
                ok = false;
                break;
            }
        }
        if(ok) return {4, i};
    }
    // スリーカード
    if(!n2r[3].empty()){
        return {3, n2r[3][0], n2r[1][0], n2r[1][1]};
    }
    // ツーペア
    if((int)n2r[2].size() >= 2){
        int rem = (n2r[2].size()>2u)? max(n2r[2][2], n2r[1][0]): n2r[1][0];
        return {2, n2r[2][0], n2r[2][1], rem};
    }
    // ワンペア
    if((int)n2r[2].size() == 1){
        return {1, n2r[2][0], n2r[1][0], n2r[1][1], n2r[1][2]};
    }
    vector<int> res{0};
    res.insert(res.end(), n2r[1].begin(), n2r[1].begin()+5);
    return res;
}

vector<string> AA,BB,SS;
bool seen[1<<6][1<<6];
int win[1<<6][1<<6];

int solve(int rem,int alice,int turn){
    if(seen[rem][alice]) return win[rem][alice];
    
    seen[rem][alice]=true;
    
    if(rem==0){
        vector<string> S=AA,T=BB;
        for(int i=0;i<6;i++){
            if(alice&(1<<i)){
                S.push_back(SS[i]);
            }else{
                T.push_back(SS[i]);
            }
        }
        vector<int> ma1,ma2;
        ma1=highest_hand(S);
        ma2=highest_hand(T);
        
        if(ma1>ma2) return win[rem][alice]=1;
        else if(ma1==ma2) return win[rem][alice]=0;
        return win[rem][alice]=-1;
    }else{
        if(turn==0){
            int res=-3;
            for(int i=0;i<6;i++){
                if(!(rem&(1<<i))) continue;
                chmax(res,solve(rem-(1<<i),alice|(1<<i),turn^1));
                if(res==1) break;
            }
            return win[rem][alice]=res;
        }else{
            int res=3;
            for(int i=0;i<6;i++){
                if(!(rem&(1<<i))) continue;
                chmin(res,solve(rem-(1<<i),alice,turn^1));
                if(res==-1) break;
            }
            return win[rem][alice]=res;
        }
    }
}

vector<int> AAA,BBB,SSS;
bool seeen[1<<6][1<<6];
int wiin[1<<6][1<<6];

int solve_without_flush(int rem,int alice,int turn){
    if(seeen[rem][alice]) return wiin[rem][alice];
    
    seeen[rem][alice]=true;
    
    if(rem==0){
        vector<int> S=AAA,T=BBB;
        for(int i=0;i<6;i++){
            if(alice&(1<<i)){
                S.push_back(SSS[i]);
            }else{
                T.push_back(SSS[i]);
            }
        }
        vector<int> ma1,ma2;
        ma1=highest_hand_without_flush(S);
        ma2=highest_hand_without_flush(T);
        
        if(ma1>ma2) return wiin[rem][alice]=1;
        else if(ma1==ma2) return wiin[rem][alice]=0;
        return wiin[rem][alice]=-1;
    }else{
        if(turn==0){
            int res=-3;
            for(int i=0;i<6;i++){
                if(!(rem&(1<<i))) continue;
                chmax(res,solve_without_flush(rem-(1<<i),alice|(1<<i),turn^1));
                if(res==1) break;
            }
            return wiin[rem][alice]=res;
        }else{
            int res=3;
            for(int i=0;i<6;i++){
                if(!(rem&(1<<i))) continue;
                chmin(res,solve_without_flush(rem-(1<<i),alice,turn^1));
                if(res==-1) break;
            }
            return wiin[rem][alice]=res;
        }
    }
}

string get(int ran,int sui){
    string res;
    res+=ranks[ran];
    res+=suits[sui];
    return res;
}

bool drawabac[14][14][14][14][14];
pair<int,int> drawuse[14][14][14];

int Duse[14][14][14][14];

int henkan(char c){
    if(c=='C') return 0;
    if(c=='D') return 1;
    if(c=='H') return 2;
    if(c=='S') return 3;
    return -1;
}

int chan(string S){
    return getint(S)*4+henkan(S[1]);
}

int chancn[55];

vector<int> usenumber[1<<13][7];

vector<int> st[14][14];

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    vector<string> mu;
    
    auto output=[&](vector<string> &S){
        if(si(S)==0){
            cout<<"NO\n";
        }else{
            //assert(si(S)==6);
            cout<<"YES";
            for(auto a:S) cout<<" "<<a;
            cout<<"\n";
        }
    };
    
    auto make_without_flush=[&](vector<string> &A,vector<string> &B,vector<int> &use){
        vector<string> res(si(use));
        vector<int> cc(4);
        if(A[0][1]==A[1][1]) cc[henkan(A[0][1])]=1;
        if(B[0][1]==B[1][1]) cc[henkan(B[0][1])]=1;
        
        vector<int> jun;
        for(int i=0;i<4;i++){
            if(!cc[i]) jun.push_back(i);
        }
        for(int i=0;i<4;i++){
            if(cc[i]) jun.push_back(i);
        }
        
        chancn[chan(A[0])]++;
        chancn[chan(A[1])]++;
        chancn[chan(B[0])]++;
        chancn[chan(B[1])]++;
        for(int i=0;i<si(use);i++){
            for(int a:jun){
                if(chancn[use[i]*4+a]==0){
                    string A=get(use[i],a);
                    res[i]=(A);
                    chancn[use[i]*4+a]++;
                    break;
                }
            }
        }
        for(int i=0;i<si(res);i++){
            chancn[chan(res[i])]=0;
        }
        chancn[chan(A[0])]=0;
        chancn[chan(A[1])]=0;
        chancn[chan(B[0])]=0;
        chancn[chan(B[1])]=0;
        output(res);
    };
    
    for(int a=0;a<13;a++){
        for(int b=0;b<13;b++){
            for(int c=0;c<13;c++){
                for(int d=c;d<13;d++){
                    for(int e=d;e<13;e++){
                        if(si(st[a][b])) continue;
                        vector<int> Y={a,b,c,d,e};
                        sort(all(Y));
                        bool f=true;
                        for(int i=0;i<4;i++) f&=(Y[i]+1==Y[i+1]);
                        if(Y==vector<int>{0,1,2,3,12}) f=true;
                        if(f){
                            st[a][b]={c,d,e};
                        }
                    }
                }
            }
        }
    }
    
    for(int bit=0;bit<(1<<13);bit++){
        if(__builtin_popcount(bit)>4) continue;
        for(int S=0;S<(1<<13);S++){
            if(bit&S) continue;
            if(__builtin_popcount(S)>6) continue;
            if(si(usenumber[bit][__builtin_popcount(S)])) continue;
            int use=bit|S;
            use*=2;
            if(use&(1<<13)) use|=(1<<0);
            //if(use&1) use|=(1<<13);
            bool ok=true;
            for(int i=0;i<=9;i++){
                int cn=0;
                for(int j=0;j<5;j++) if(use&(1<<(i+j))) cn++;
                if(cn==5) ok=false;
            }
            if(ok){
                for(int s=0;s<13;s++){
                    if(S&(1<<s)) usenumber[bit][__builtin_popcount(S)].push_back(s);
                }
            }
        }
        //for(int j=0;j<=6;j++) assert(usenumber[bit][j]!=-1);
    }
    
    vector<int> cn(13);
    for(int a=0;a<13;a++){
        for(int b=0;b<13;b++){
            for(int c=0;c<13;c++){
                drawuse[a][b][c]=mp(-1,-1);
                for(int d=0;d<13;d++){
                    if(drawuse[a][b][c].fi!=-1) break;
                    for(int e=d;e<13;e++){
                        if(drawuse[a][b][c].fi!=-1) break;
                        cn[a]++;
                        cn[b]++;
                        cn[c]++;
                        cn[d]++;
                        cn[e]++;
                        bool ok=true;
                        if(cn[a]>=3) ok=false;
                        if(cn[b]>=3) ok=false;
                        if(cn[c]>=3) ok=false;
                        if(cn[d]>=3) ok=false;
                        if(cn[e]>=3) ok=false;
                        cn[a]--;
                        cn[b]--;
                        cn[c]--;
                        cn[d]--;
                        cn[e]--;
                        
                        if(!ok) continue;
                        
                        AAA.clear();
                        BBB.clear();
                        SSS.clear();
                        memset(seeen,0,sizeof(seeen));
                        memset(wiin,0,sizeof(wiin));
                        AAA.push_back(a);
                        AAA.push_back(b);
                        BBB.push_back(a);
                        BBB.push_back(c);
                        SSS.push_back(b);
                        SSS.push_back(c);
                        SSS.push_back(d);
                        SSS.push_back(d);
                        SSS.push_back(e);
                        SSS.push_back(e);
                        
                        int res=solve_without_flush(63,0,0);
                        if(res==0){
                            drawabac[a][b][c][d][e]=true;
                            drawuse[a][b][c]=mp(d,e);
                        }
                    }
                }
            }
        }
    }
    
    for(int a=0;a<13;a++){
        for(int b=a;b<13;b++){
            for(int c=0;c<13;c++){
                for(int d=c;d<13;d++){
                    Duse[a][b][c][d]=-1;
                    Duse[b][a][c][d]=-1;
                    Duse[a][b][d][c]=-1;
                    Duse[b][a][d][c]=-1;
                    for(int e=0;e<13;e++){
                        if(Duse[a][b][c][d]!=-1) break;
                        cn[a]++;
                        cn[b]++;
                        cn[c]++;
                        cn[d]++;
                        cn[e]++;
                        bool ok=true;
                        if(cn[a]>=3) ok=false;
                        if(cn[b]>=3) ok=false;
                        if(cn[c]>=3) ok=false;
                        if(cn[d]>=3) ok=false;
                        if(cn[e]>=3) ok=false;
                        cn[a]--;
                        cn[b]--;
                        cn[c]--;
                        cn[d]--;
                        cn[e]--;
                        
                        if(!ok) continue;
                        
                        AAA.clear();
                        BBB.clear();
                        SSS.clear();
                        memset(seeen,0,sizeof(seeen));
                        memset(wiin,0,sizeof(wiin));
                        AAA.push_back(a);
                        AAA.push_back(b);
                        BBB.push_back(c);
                        BBB.push_back(d);
                        SSS.push_back(a);
                        SSS.push_back(b);
                        SSS.push_back(c);
                        SSS.push_back(d);
                        SSS.push_back(e);
                        SSS.push_back(e);
                        
                        int res=solve_without_flush(63,0,0);
                        if(res==0){
                            Duse[a][b][c][d]=e;
                            Duse[b][a][c][d]=e;
                            Duse[a][b][d][c]=e;
                            Duse[b][a][d][c]=e;
                        }
                    }
                }
            }
        }
    }
    
    int Q;cin>>Q;
    while(Q--){
        vector<string> A(2),B(2);
        for(int i=0;i<2;i++) cin>>A[i];
        for(int i=0;i<2;i++) cin>>B[i];
        
        sort(all(A));
        sort(all(B));
        map<char,int> cc;
        for(int i=0;i<2;i++) cc[A[i][0]]++;
        for(int i=0;i<2;i++) cc[B[i][0]]++;
        
        if(si(cc)==4){
            vector<int> res1,res2;
            for(int i=0;i<3;i++) res1.push_back(getint(A[0]));
            for(int i=0;i<3;i++) res1.push_back(getint(A[1]));
            make_without_flush(A,B,res1);
            
            for(int i=0;i<3;i++) res2.push_back(getint(B[0]));
            for(int i=0;i<3;i++) res2.push_back(getint(B[1]));
            make_without_flush(A,B,res2);
            
            if(Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])]==-1){
                output(mu);
            }else{
                int x=Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])];
                vector<int> res={getint(A[0]),getint(A[1]),getint(B[0]),getint(B[1]),x,x};
                make_without_flush(A,B,res);
            }
        }
        if(si(cc)==3){
            if(A[0][0]==A[1][0]){
                vector<int> res1,res2;
                for(int i=0;i<2;i++) res1.push_back(getint(A[0]));
                int use=0;
                use|=1<<(getint(A[0]));
                use|=1<<(getint(B[0]));
                use|=1<<(getint(B[1]));
                for(int x:usenumber[use][4]) res1.push_back(x);
                make_without_flush(A,B,res1);
                
                for(int i=0;i<3;i++) res2.push_back(getint(B[0]));
                for(int i=0;i<3;i++) res2.push_back(getint(B[1]));
                make_without_flush(A,B,res2);
                
                if(Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])]==-1){
                    output(mu);
                }else{
                    int x=Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])];
                    vector<int> res={getint(A[0]),getint(A[1]),getint(B[0]),getint(B[1]),x,x};
                    make_without_flush(A,B,res);
                }
            }else if(B[0][0]==B[1][0]){
                vector<int> res1,res2;
                for(int i=0;i<3;i++) res1.push_back(getint(A[0]));
                for(int i=0;i<3;i++) res1.push_back(getint(A[1]));
                make_without_flush(A,B,res1);
                
                for(int i=0;i<2;i++) res2.push_back(getint(B[0]));
                int use=0;
                use|=1<<(getint(B[0]));
                use|=1<<(getint(A[0]));
                use|=1<<(getint(A[1]));
                for(int x:usenumber[use][4]) res2.push_back(x);
                make_without_flush(A,B,res2);
                
                if(Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])]==-1){
                    output(mu);
                }else{
                    int x=Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])];
                    vector<int> res={getint(A[0]),getint(A[1]),getint(B[0]),getint(B[1]),x,x};
                    make_without_flush(A,B,res);
                }
            }else{
                int a,b,c;
                for(int i=0;i<2;i++){
                    if(cc[A[i][0]]==2) a=getint(A[i]);
                    else b=getint(A[i]);
                }
                for(int i=0;i<2;i++){
                    if(cc[B[i][0]]==2) a=getint(B[i]);
                    else c=getint(B[i]);
                }
                vector<int> res1,res2;
                for(int i=0;i<3;i++) res1.push_back(b);
                for(int x:usenumber[(1<<a)|(1<<b)|(1<<c)][3]) res1.push_back(x);
                make_without_flush(A,B,res1);
                
                for(int i=0;i<3;i++) res2.push_back(c);
                int use=0;
                use|=(1<<a);
                use|=(1<<c);
                for(int x:usenumber[(1<<a)|(1<<b)|(1<<c)][2]) res2.push_back(x);
                res2.push_back(a);
                make_without_flush(A,B,res2);
                
                if(drawuse[a][b][c].fi==-1){
                    output(mu);
                }else{
                    int x=drawuse[a][b][c].fi,y=drawuse[a][b][c].se;
                    vector<int> res3={b,c,x,x,y,y};
                    make_without_flush(A,B,res3);
                }
            }
        }
        if(si(cc)==2){
            if(A[0][0]==A[1][0]){
                if(B[0][0]==B[1][0]){
                    vector<int> res1,res2;
                    for(int i=0;i<2;i++) res1.push_back(getint(A[0]));
                    for(int x:usenumber[(1<<getint(A[0]))|(1<<getint(B[0]))][4]) res1.push_back(x);
                    make_without_flush(A,B,res1);
                    
                    for(int i=0;i<2;i++) res2.push_back(getint(B[0]));
                    for(int x:usenumber[(1<<getint(A[0]))|(1<<getint(B[0]))][4]) res2.push_back(x);
                    make_without_flush(A,B,res2);
                    
                    if(Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])]==-1){
                        output(mu);
                    }else{
                        int x=Duse[getint(A[0])][getint(A[1])][getint(B[0])][getint(B[1])];
                        vector<int> res={getint(A[0]),getint(A[1]),getint(B[0]),getint(B[1]),x,x};
                        make_without_flush(A,B,res);
                    }
                }else{
                    int a,b;
                    a=getint(A[0]);
                    b=getint(B[0])^getint(B[1])^a;
                    vector<int> res1,res2;
                    
                    res1.push_back(a);
                    for(int x:usenumber[(1<<a)|(1<<b)][5]) res1.push_back(x);
                    make_without_flush(A,B,res1);
                    
                    // bob kaku
                    if(B[0][1]==B[1][1]){
                        vector<int> res;
                        for(int x:usenumber[(1<<a)|(1<<b)][6]) res.push_back(x);
                        vector<string> Z;
                        for(int i=0;i<6;i++){
                            string aa;
                            aa+=ranks[res[i]];
                            aa+=B[0][1];
                            Z.push_back(aa);
                        }
                        output(Z);
                    }else if(si(st[a][b])){
                        vector<int> res;
                        for(int x:st[a][b]){
                            res.push_back(x);
                            res.push_back(x);
                        }
                        make_without_flush(A,B,res);
                    }else{
                        int c=-1;
                        for(int k=12;k>=0;k--){
                            if(k!=a&&k!=b&&a<k){
                                c=k;
                                break;
                            }
                        }
                        if(c!=-1){
                            vector<int> res={b,b,b,c,c,c};
                            make_without_flush(A,B,res);
                        }else{
                            if(a==11&&b==12){
                                vector<int> res={b,b};
                                for(int x:usenumber[(1<<a)|(1<<b)][4]) res.push_back(x);
                                make_without_flush(A,B,res);
                            }else{
                                assert(a==12);
                                output(mu);
                            }
                        }
                    }
                    
                    if(drawuse[a][a][b].fi==-1){
                        output(mu);
                    }else{
                        int x=drawuse[a][a][b].fi,y=drawuse[a][a][b].se;
                        vector<int> res3={a,b,x,x,y,y};
                        make_without_flush(A,B,res3);
                    }
                }
            }else{
                if(B[0][0]==B[1][0]){
                    int a,b;
                    a=getint(B[0]);
                    b=getint(A[0])^getint(A[1])^a;
                    
                    vector<int> res1,res2,res3;
                    for(int i=0;i<3;i++) res1.push_back(b);
                    for(int x:usenumber[(1<<a)|(1<<b)][3]) res1.push_back(x);
                    make_without_flush(A,B,res1);
                    
                    for(int x:usenumber[(1<<a)|(1<<b)][3]) res2.push_back(x);
                    res2.push_back(res2[0]);
                    res2.push_back(res2[0]);
                    res2.push_back(res2[0]);
                    make_without_flush(A,B,res2);
                    
                    if(drawuse[a][b][a].fi==-1){
                        output(mu);
                    }else{
                        int x=drawuse[a][b][a].fi,y=drawuse[a][b][a].se;
                        vector<int> res3={b,a,x,x,y,y};
                        make_without_flush(A,B,res3);
                    }
                }else{
                    int a=getint(A[0]),b=getint(A[1]);
                    vector<int> res1,res2,res3;
                    
                    for(int x:usenumber[(1<<a)|(1<<b)][4]) res1.push_back(x);
                    res1.push_back(res1[0]);
                    res1.push_back(res1[0]);
                    make_without_flush(A,B,res1);
                    
                    if(B[0][1]==B[1][1]){
                        vector<int> res;
                        for(int x:usenumber[(1<<a)|(1<<b)][6]) res.push_back(x);
                        vector<string> Z;
                        for(int i=0;i<6;i++){
                            string aa;
                            aa+=ranks[res[i]];
                            aa+=B[0][1];
                            Z.push_back(aa);
                        }
                        output(Z);
                    }else{
                        output(mu);
                    }
                    
                    for(int x:usenumber[(1<<a)|(1<<b)][3]){
                        res3.push_back(x);
                        res3.push_back(x);
                    }
                    make_without_flush(A,B,res3);
                }
            }
        }
        if(si(cc)==1){
            vector<int> res1,res3;
            for(int x:usenumber[(1<<getint(A[0]))][6]) res1.push_back(x);
            make_without_flush(A,B,res1);
            
            output(mu);
            
            for(int x:usenumber[(1<<getint(A[0]))][3]){
                res3.push_back(x);
                res3.push_back(x);
            }
            make_without_flush(A,B,res3);
        }
    }
    
}

详细

Test #1:

score: 100
Accepted
time: 591ms
memory: 6124kb

input:

3
JC 4H
TS 5D
7C 3C
7H TH
2D KH
4D JC

output:

YES 4C 4D 4S JD JH JS
YES 5C 5H 5S TC TD TH
YES 4C JD 5C TC 5H 5S
YES 3D 3S 3H 2D 4D 5D
YES TD TS TC 2D 4D 7D
YES 3D TD 2D 2S 2C 2H
YES 2C 2H 2S KC KD KS
YES 4C 4H 4S JD JH JS
YES 2C KC 4C JD 4H 4S

result:

ok 3 test cases (3 test cases)

Test #2:

score: 0
Accepted
time: 583ms
memory: 5836kb

input:

2
AS AH
AC AD
AS AH
2S 2H

output:

YES 2C 3C 4C 6C 7C 8C
NO
YES 2C 2D 3C 3D 4C 4D
YES AC AD 3C 4C 6C 7C
YES 2C 2D 3C 4C 6C 7C
NO

result:

ok 2 test cases (2 test cases)

Test #3:

score: 0
Accepted
time: 590ms
memory: 5868kb

input:

1
3C 3D
3H 5S

output:

YES 3S 2C 4C 7C 8C 9C
YES 2C 2D 4C 4D 6C 6D
YES 3S 5C 2C 2D 5D 5H

result:

ok 1 test cases (1 test case)

Test #4:

score: 0
Accepted
time: 587ms
memory: 5872kb

input:

1
9C KC
JC 5D

output:

YES 9D 9H 9S KD KH KS
YES 5H 5S 5C JD JH JS
YES 9D KD 5H JD 5S 5C

result:

ok 1 test cases (1 test case)

Test #5:

score: 0
Accepted
time: 838ms
memory: 5912kb

input:

100000
6S 7C
KH 3S
5S 2D
AC TS
QD 6H
TC JD
5C AD
4S TH
AD 3S
JC 5S
TH QH
9S JH
AD JC
JS 7H
3S 9S
JC 6S
4D 7S
3S JH
AD JS
7D 4D
7D QS
QH JC
4H JS
7H TS
5D AD
3S 8D
AC TH
5D 3S
9H TD
TS 7D
7D 8C
AD 5H
7C QS
2C TH
QD AS
4S 2H
8D JS
9S 5H
2C TC
2D 5S
TD 2C
AS 2D
6H 6S
AC 2S
2C 8D
4C KS
JD 9D
2D AD
AS QH...

output:

YES 6C 6D 6H 7D 7H 7S
YES 3C 3D 3H KC KD KS
NO
YES 2C 2H 2S 5C 5D 5H
YES AD AH AS TC TD TH
NO
YES 6C 6D 6S QC QH QS
YES JC JH JS TD TH TS
YES 6C QC JC TD TH TS
YES 5D 5H 5S AC AH AS
YES 4C 4D 4H TC TD TS
YES 5D AC 4C TC 4D 4H
YES 3C 3D 3H AC AH AS
YES 5C 5D 5H JD JH JS
YES 3C AC 5C JD 5D 5H
YES QC Q...

result:

ok 100000 test cases (100000 test cases)

Test #6:

score: 0
Accepted
time: 817ms
memory: 5840kb

input:

100000
6D 7D
8C JH
2C 4S
3D 2D
8C AD
7H 5S
QC JC
JH 7H
TC TH
9D 5D
7S 3C
TC 7D
JD 5C
4C 6D
4S 5H
7D 6C
AC TH
7D 4D
QH 3D
TS KC
AD 8D
5H 3S
9D 6D
6S 2C
JH KS
7C 3H
QD 7C
7S KD
8H 9D
3C KD
7H 9S
KD TS
5D KH
3C AC
4S 3D
4C 3C
9C 2H
8C JH
8H 9C
KS 5S
QC 4S
9H TH
TD KD
JC 8D
AS KH
KS 2H
7D 6D
AD 6S
7H 6C...

output:

YES 6C 6H 6S 7C 7H 7S
YES 8H 8S 8D JC JS JD
NO
YES 4C 4H 4D 5C 7C 8C
YES 3C 3H 3S 5C 7C 2H
YES 4C 3C 2H 2S 3H 3S
YES 8D 8H 8S AC AH AS
YES 5C 5D 5H 7C 7D 7S
NO
YES QD QS QH 2D 3D 4D
YES 7D 7S 7C 2D 3D JD
YES QD 7D 2D 2S 7S 7C
YES TS TD 2C 3C 4C 7C
YES 5C 5H 5S 9C 9H 9S
NO
YES 3D 3H 3S 2C 4C 5C
YES T...

result:

ok 100000 test cases (100000 test cases)

Test #7:

score: 0
Accepted
time: 816ms
memory: 5920kb

input:

100000
5S 6H
6D KH
AS 3D
KS 3S
7S 4S
7D JD
4D 6D
7D AD
2C JH
6C QD
7H TC
JD 3C
TC 2C
AH JH
3C 9S
5S 9H
JC 6H
QS 3H
6D 7C
2D 4D
9H 8C
QC KS
7H 9S
TH JS
JS AS
8H QH
8D 5S
7S 3S
2D QD
AC 9H
3H 6S
8H JC
3H 8C
4H AS
QC TH
9S 6S
3S 9D
7C TC
QS JC
6S 9S
4C 9S
5S 6D
3H AH
4D 3D
7H 2C
QH 7C
3C QS
QD KH
5C QH...

output:

YES 5C 5D 5H 2C 3C 7C
YES KC KD KS 2C 3C 6C
YES 5C KC 2C 2D 2H 2S
YES AC AD AH 2C 4C 6C
YES KC KD KH 2C 4C 3C
YES AC KC 2C 2D KD KH
YES 4C 4H 4D 2C 3C 5C
YES JC JH JS 2C 3C 7C
YES 4C JC 2C 2H 2D 2S
YES 4C 4H 4S 6C 6H 6S
YES 7C 7H 7S AC AH AS
NO
YES 2D 2H 2S JC JD JS
YES 6D 6H 6S QC QH QS
YES 2D JC 6...

result:

ok 100000 test cases (100000 test cases)

Test #8:

score: 0
Accepted
time: 823ms
memory: 6160kb

input:

100000
QS 2C
8D 3H
AD JD
5H 9H
5C JS
4S 3C
9D 9S
TH QC
6C 6H
QH 4S
JH JD
7H 6C
KC 9D
4C 5C
3H QC
6H 8H
7S 4S
3S 8C
6C 4D
AD 9H
8H 3S
JS KC
3C AS
9S 2C
8D 7D
8S KC
4S JD
TH 7D
3D 9S
AD AC
9D 2D
2S KH
6D AC
7H 2D
4D AC
5D JC
JH JD
2C 6D
8S 6D
9S 5S
JD 9C
6C 7S
TC 6H
TH 9H
JD 8D
8H KH
5C 9C
AH 9D
2S TH...

output:

YES 2D 2H 2S QC QD QH
YES 3C 3D 3S 8C 8H 8S
YES 2D QC 3C 8C 3D 3S
YES AC AS AH JC JS JH
YES 5C 5S 5D 9C 9S 9D
NO
YES 5D 5H 5S JC JD JH
YES 3D 3H 3S 4C 4D 4H
NO
YES 9C 9H 2C 3C 4C 5C
YES QD QH QS TC TD TS
NO
YES 6D 6S 2C 3C 7C 8C
YES 4C 4D 4H QC QD QS
NO
YES JC JS 2C 3C 4C 8C
YES 6D 6H 6S 7C 7D 7S
NO...

result:

ok 100000 test cases (100000 test cases)

Test #9:

score: 0
Accepted
time: 828ms
memory: 5956kb

input:

100000
JS TS
6S AH
9H 2D
9D 2C
8S TH
KC 9H
AD 7H
AS 2S
6D TC
TS 9D
2S 3C
JH 2D
7D QH
2D KC
JD 8C
4D TS
7C 2H
JC 6C
2S 8C
AH 5C
JS 2D
AH QD
6D 6H
9D TH
KD 2H
2S AC
2H 3D
AH 9H
2H KC
TS JC
2H 5H
8S KD
4H 6C
5S QS
3D AC
5S JC
7S 9C
KS 5S
9C AD
KC 4H
5H KH
TD KD
8C 4D
3S 8S
5D JC
JS KS
8H AD
8D 2H
AS QD...

output:

YES JC JD JH TC TD TH
YES 6C 6D 6H AC AD AS
NO
YES 3C 4C 5C 7C 3D 3H
NO
YES 3C 3D 4C 4D 5C 5D
YES 8C 8D 8H TC TD TS
YES 9C 9D 9S KD KH KS
YES 8C TC 9C KD 2C 2D
YES 7C 7D 7S 3C 4C 6C
YES 2C 2D 2H 3C 4C AC
YES 7C 2C 2D 2H 3C 3D
YES 6C 6H 6S 2C 3C 4C
YES 9C 9H 9S 2C 3C TD
YES 6C 9C 2C 2D 2H 2S
YES 3D 3...

result:

ok 100000 test cases (100000 test cases)

Test #10:

score: 0
Accepted
time: 818ms
memory: 5884kb

input:

100000
TH 9C
3H KH
QD 5C
AS 7D
6D 4C
5S 7H
2D 6H
9C 4C
JD AC
7D JC
TC 3S
QH 2D
JC 5H
9D 7S
6S TC
7S KC
4S TS
7S QS
TD KS
7D 8H
KS 2D
5H 7C
9C KH
2S 9D
JD 5H
9C QH
7D QC
6H KC
6S 7D
KS 6C
TC KD
2C 4D
3S 5S
AD 6S
KH 7D
KS 5H
QC QH
8C 3S
KH AC
8D TS
QD TH
9C 8C
KS 8H
9C QC
6D 8H
9D TH
9C 5S
6C 6S
KH 6S...

output:

YES 9D 9S 9H TC TD TS
YES 3C 3D 3S KC KD KS
NO
YES 5D 5H 5S QC QH QS
YES 7C 7H 7S AC AD AH
YES 5D QC 7C AC 2C 2D
YES 4D 4H 4S 6C 6H 6S
YES 5C 5D 5H 7C 7D 7S
YES 4D 6C 5C 7C 2C 2D
YES 2H 2S 2C 6D 6S 6C
YES 4D 4H 4S 9D 9H 9S
YES 2H 6D 4D 9D 3D 3H
YES AD AH AS 2C 3C 4C
YES 7C 7H 7S 2C 3C JH
YES AD 7C 2...

result:

ok 100000 test cases (100000 test cases)