模拟即可
#include<iostream> #include<cstring> #include<cstring> #include<cstdio> #include<algorithm> #include<map> using namespace std; map<char,int>p; char a[111],b[111]; int an[16],bn[16];//单张 int ad[16],bd[16];//对子 int as[16],bs[16];//三张 int asd[16][16],bsd[16][16];//三带一 int asd2[16][16],bsd2[16][16]; int az[16],bz[16];//炸弹 int aw,bw;//王炸 int a411[16][16][16],b411[16][16][16];//4带1带1 int a42[16][16],b42[16][16];//4带2 int la,lb; void init() { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(an,0,sizeof(an)); memset(bn,0,sizeof(bn)); memset(ad,0,sizeof(ad)); memset(bd,0,sizeof(bd)); memset(as,0,sizeof(as)); memset(bs,0,sizeof(bs)); memset(asd,0,sizeof(asd)); memset(bsd,0,sizeof(bsd)); memset(az,0,sizeof(az)); memset(bz,0,sizeof(bz)); memset(a411,0,sizeof(a411)); memset(b411,0,sizeof(b411)); memset(a42,0,sizeof(a42)); memset(b42,0,sizeof(b42)); memset(asd2,0,sizeof(asd2)); memset(bsd2,0,sizeof(bsd2)); aw=0; bw=0; } bool p42() { for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { if(a42[i][j])return true; if(b42[i][j])return false; } } return false; } bool p411() { for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { for(int k=j-1;k>=1;k--) { if(a411[i][j][k])return true; if(b411[i][j][k])return false; } } } } bool p32() { for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { if(asd2[i][j])return true; if(bsd2[i][j])return false; } } return false; } bool p31() { for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { if(asd[i][j])return true; if(bsd[i][j])return false; } } return false; } bool p3() { for(int i=15;i>=1;i--) { if(as[i])return true; if(bs[i])return false; } return false; } bool p2() { for(int i=15;i>=1;i--) { if(ad[i])return true; if(bd[i])return false; } return false; } bool p1() { for(int i=15;i>=1;i--) { if(an[i])return true; if(bn[i])return false; } return false; } bool solve() { //统计下 for(int i=1;i<=15;i++) { if(an[i]>=2)ad[i]=1; if(an[i]>=3) { as[i]=1; for(int j=1;j<=15;j++) { if(i==j)continue; if(an[j])asd[i][j]=1; if(an[j]>=2)asd2[i][j]=1; } } if(an[i]>=4) { az[i]=1; for(int j=1;j<=15;j++) { if(i==j)continue; if(an[j]>=2)a42[i][j]=1; if(an[j]) { for(int k=1;k<=15;k++) { if(k==i||k==j)continue; if(an[k])a411[i][j][k]=1; } } } } if(an[14]&&an[15])aw=1; if(bn[i]>=2)bd[i]=1; if(bn[i]>=3) { bs[i]=1; for(int j=1;j<=15;j++) { if(i==j)continue; if(bn[j])bsd[i][j]=1; if(bn[j]>=2)bsd2[i][j]=1; } } if(bn[i]>=4) { bz[i]=1; for(int j=1;j<=15;j++) { if(i==j)continue; if(bn[j]>=2)b42[i][j]=1; if(bn[j]) { for(int k=1;k<=15;k++) { if(k==i||k==j)continue; if(bn[k])b411[i][j][k]=1; } } } } if(bn[15]&&bn[14])bw=1; } //判断刚好出完 for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { if(a42[i][j]&&la==6)return true; } } for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { for(int k=j-1;k>=1;k--) { if(a411[i][j][k]&&la==6)return true; } } } for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { if(asd2[i][j]&&la==5)return true; } } for(int i=15;i>=1;i--) { for(int j=15;j>=1;j--) { if(asd[i][j]&&la==4)return true; } } for(int i=15;i>=1;i--) { if(as[i]&&la==3)return true; } for(int i=15;i>=1;i--) { if(ad[i]&&la==2)return true; } for(int i=15;i>=1;i--) { if(an[i]&&la==1)return true; } //王炸的情况 if(bw)return false; if(aw)return true; //炸弹的情况 for(int i=15;i>=1;i--) { if(az[i])return true; if(bz[i])return false; } //各种看大小 if(p42())return true; if(p411())return true; if(p32())return true; if(p31())return true; if(p3())return true; if(p2())return true; if(p1())return true; return false; } int main() { //全变成数字好做 p['3']=1; p['4']=2; p['5']=3; p['6']=4; p['7']=5; p['8']=6; p['9']=7; p['T']=8; p['J']=9; p['Q']=10; p['K']=11; p['A']=12; p['2']=13; p['X']=14; p['Y']=15; int t; scanf("%d",&t); while(t--) { init(); scanf("%s",a); scanf("%s",b); la=strlen(a); for(int i=0;i<la;i++)an[p[a[i]]]++; lb=strlen(b); for(int i=0;i<lb;i++)bn[p[b[i]]]++; if(solve())printf("Yes\n"); else printf("No\n"); } return 0; }