#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, uint64_t used, int from, int distance, const vector> & rank_adj, const vector> & suit_adj) { used|= (1u << from); if (distance == (int)(cards.size() - 1)) return true; //cout << "from " << from ; for (int i: rank_adj[from / 4] ) { if (i!=from) { if ((used & (1u << i)) ) { //cout << "go to " << i; if (DFS(cards, used, i, distance+1, rank_adj, suit_adj)) return true; } } } for (int i: suit_adj[from % 4]) { if (i!=from) { if ((used & (1u << i))) { //cout << "go to " << i; if (DFS(cards, used, i, distance+1, rank_adj, suit_adj)) return true; } } } return false; } int main () { ios::sync_with_stdio(false); for(;;) { int n; cin >> n; if (cin.eof()) break; unordered_set cards; vector> rank_adj(13); vector> suit_adj(4); 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].push_back(id); suit_adj[id % 4].push_back(id); } if (n == 1) { cout << "NO\n"; continue; } bool flag = false; for (int from: cards) { //cout << "start at" << from << '\n'; if (DFS(cards, 0, from, 0, rank_adj, suit_adj)) { cout << "YES\n"; flag = true; break; } } if (!flag) { cout << "NO\n"; continue; } } return 0; }