直接模拟,先看能不能一手出完,不能一手出完则先炸弹,然后3带2,3带1,3,一对,单个出
#include <cstdio>
#include <cstring>
const int maxn = 10007;
char str_1[maxn], str_2[maxn];
int num_1[30], num_2[30];
int len_1, len_2;
int getPoint(char c) {
if (c >= '3' && c <= '9') {
return c - '0';
}
if (c == 'T') {
return 10;
}
if (c == 'J') {
return 11;
}
if (c == 'Q') {
return 12;
}
if (c == 'K') {
return 13;
}
if (c == 'A') {
return 14;
}
if (c == '2') {
return 15;
}
if (c == 'X') {
return 16;
}
if (c == 'Y') {
return 17;
}
}
int getNuke(int *card) {
if (card[17] && card[16]) {
return 1;
}
return 0;
}
int findNum(int *card, int cnt_num) {
for (int i = 17; i >= 0; i--) {
if (card[i] == cnt_num) {
return i;
}
}
return -1;
}
bool winFirst() {
if (len_1 == 1) {
return 1;
}
if (len_1 == 2) {
int cnt_card = findNum(num_1, 2);
if (cnt_card != -1) {
return 1;
}
}
if (len_1 == 3) {
int cnt_card = findNum(num_1, 3);
if (cnt_card != -1) {
return 1;
}
}
if (len_1 == 4) {
int b = findNum(num_1, 3);
int a = findNum(num_1, 1);
int c = findNum(num_1, 4);
if (a != -1 && b != -1) {
return 1;
}
if (c != -1) {
return 1;
}
}
if (len_1 == 5) {
int a = findNum(num_1, 3);
int b = findNum(num_1, 2);
if (a != -1 && b != -1) {
return 1;
}
}
if (len_1 == 6) {
int a = findNum(num_1, 4);
if (a != -1) {
return 1;
}
}
return 0;
}
int checkBomb() {
int bomb = findNum(num_1, 4);
if (bomb != -1) {
int a = findNum(num_2, 4);
if (a > bomb) {
return 0;
}
return 1;
}
return 0;
}
int checkTrioPair() {
int trio = findNum(num_1, 3);
if (trio != -1) {
int a = -1;
for (int i = 17; i >= 0; i--) {
if (i != trio && num_1[i] >= 2) {
a = i;
break;
}
}
if (a != -1) {
int b = findNum(num_2, 4);
if (b != -1) {
return 0;
}
b = findNum(num_2, 3);
if (b > trio) {
for (int i = 17; i >= 0; i--) {
if (i != b && num_2[i] >= 2) {
return 0;
}
}
return 1;
}
return 1;
}
return 0;
}
return 0;
}
int checkTrioSolo() {
int trio = findNum(num_1, 3);
if (trio != -1) {
int a = -1;
for (int i = 0; i <= 17; i++) {
if (i != trio && num_1[i] >= 1) {
a = i;
break;
}
}
if (a != -1) {
int b = findNum(num_2, 4);
if (b != -1) {
return 0;
}
b = findNum(num_2, 3);
if (b > trio) {
for (int i = 0; i <= 17; i++) {
if (i != b && num_2[i] >= 1) {
return 0;
}
}
return 1;
}
return 1;
}
return 0;
}
return 0;
}
int checkTrio() {
int trio = findNum(num_1, 3);
if (trio != -1) {
int b = findNum(num_2, 4);
if (b != -1) {
return 0;
}
b = findNum(num_2, 3);
if (b > trio) {
return 0;
}
return 1;
}
return 0;
}
int checkPair() {
int a = -1;
int b = -1;
b = findNum(num_2, 4);
if (b != -1) {
return 0;
}
for (int i = 17; i >= 0; i--) {
if (num_1[i] >= 2) {
a = i;
break;
}
}
for (int i = 17; i >= 0; i--) {
if (num_2[i] >= 2) {
b = i;
break;
}
}
if (a != -1 && a >= b) {
return 1;
}
return 0;
}
int checkSolo() {
int a = - 1;
int b = -1;
b = findNum(num_2, 4);
if (b != -1) {
return 0;
}
for (int i = 17; i >= 0; i--) {
if (num_1[i] >= 1) {
a = i;
break;
}
}
for (int i = 17; i >= 0; i--) {
if (num_2[i] >= 1) {
b = i;
break;
}
}
if (a != -1 && a >= b) {
return 1;
}
return 0;
}
int main() {
// freopen("in.txt", "r", stdin);
int test_case;
scanf("%d", &test_case);
while (test_case--) {
memset(num_1, 0, sizeof(num_1));
memset(num_2, 0, sizeof(num_2));
scanf("%s%s", str_1, str_2);
len_1 = strlen(str_1);
len_2 = strlen(str_2);
for (int i = 0; i < len_1; i++) {
int point = getPoint(str_1[i]);
num_1[point]++;
}
for (int i = 0; i < len_2; i++) {
int point = getPoint(str_2[i]);
num_2[point]++;
}
if (winFirst()) {
printf("Yes\n");
continue;
}
if (getNuke(num_1)) {
printf("Yes\n");
continue;
}
if (getNuke(num_2)) {
printf("No\n");
continue;
}
if (checkBomb()) {
printf("Yes\n");
continue;
}
if (checkTrioPair()) {
printf("Yes\n");
continue;
}
if (checkTrioSolo()) {
printf("Yes\n");
continue;
}
if (checkTrio()) {
printf("Yes\n");
continue;
}
if (checkPair()) {
printf("Yes\n");
continue;
}
if (checkSolo()) {
printf("Yes\n");
continue;
}
printf("No\n");
}
return 0;
}