#include #include #include #include using namespace std; const unordered_map ranks = { {'2', 0}, {'3', 1}, {'4', 2}, {'5', 3}, {'6', 4}, {'7', 5}, {'8', 6}, {'9', 7}, {'X', 8}, {'A', 9}, {'J', 10}, {'Q', 11}, {'K', 12}}; const unordered_map suits = { {'C', 0}, {'D', 1}, {'H', 2}, {'S', 3}}; int card_id (char rank, char suit) { return ranks.at(rank)*4 + suits.at(suit); } bool DFS(const unordered_set & cards, vector used, int from, int distance) { used[from] = true; if (distance == (int)(cards.size() - 1)) return true; //cout << "from " << from ; for (int i = from % 4; i < 52; i+= 4 ) { if (i!=from) { if ((cards.find(i)!=cards.end()) && (!used[i]) ) { //cout << "go to " << i; if (DFS(cards, used, i, distance+1)) return true; } } } for (int i = from - from % 4; i < from - from % 4 + 4; i ++ ) { if (i!=from) { if ((cards.find(i)!=cards.end()) && (!used[i]) ) { //cout << "go to " << i; if (DFS(cards, used, i, distance+1)) return true; } } } return false; } int main () { for(;;) { int n; cin >> n; if (cin.eof()) break; unordered_set cards; vector rank_adj(13, 0); vector suit_adj(4, 0); for (int i = 0; i < n; i++) { char r, s; cin >> r >> s; //cout << r << s << card_id(r, s) << '\n'; int id = card_id(r, s); cards.insert(id); rank_adj[id / 4]++; suit_adj[id % 4]++; } if (n == 1) { cout << "NO\n"; continue; } /*vector used(52, false); bool flag = false; for (int from: cards) { //cout << "start at" << from << '\n'; if (DFS(cards, used, from, 0)) { cout << "YES\n"; flag = true; break; } } if (!flag) { cout << "NO\n"; continue; }*/ int single = 0; bool flag = false; for (int from: cards) { //cout << from << ' ' << rank_adj[from/4] << ' ' << suit_adj[from % 4] << '\n'; if (rank_adj[from/4] + suit_adj[from % 4] == 2) { cout << "NO\n"; flag = true; break; } else if (rank_adj[from/4] + suit_adj[from % 4] - 2 == 1) single++; } if (!flag) { if (single > 2) cout << "NO\n"; else cout << "YES\n"; } } return 0; }