#include using namespace std; int l; const int L = 52; bool vertices[L][L]; struct Card { int index; char rank; char suit; }; struct Card cards[L]; vector currentCards; void initCards() { char ranks[] = {'A','2','3','4', '5', '6','7','8','9', 'X', 'J', 'Q', 'K'}; char suits[] = {'C', 'D', 'H', 'S'}; int index = 0; for(int suit = 0; suit < 4; suit++) for(int rank = 0; rank < 13; rank++) { cards[index].index = index; cards[index].rank = ranks[rank]; cards[index].suit = suits[suit]; //cout << "index= " << cards[index].rank << cards[index].suit << endl; index++; } } void initVertices() { for(int i = 0; i < L; i++) { for(int j = 0; j < L; j++) { if(cards[i].rank == cards[j].rank || cards[i].suit == cards[j].suit) vertices[i][j] = vertices[j][i] = true; } } } void printCards() { for(int i = 0; i < L; i++) { cout << "index= " << cards[i].rank << cards[i].suit << endl; } } void printVerticesMatrix() { const int MAX_L = L; for(int i = 0; i < MAX_L; i++) { for(int j = 0; j < MAX_L; j++) { cout << vertices[i][j]; } cout << endl; } } int getIndexForCard(char rank, char suit) { for(int i = 0; i < L; i++) if(cards[i].rank == rank && cards[i].suit == suit) return i; //cout << "error" << endl; return -1; } int maxBfs = 0; void bfs_inner(int card, int depth, bool visited[]) { if(visited[card]) return; //cout << "visiting " << cards[card].rank << cards[card].suit << endl; visited[card] = true; maxBfs = max(depth, maxBfs); //int index = currentCards[i]; // index of currently iterated index //cout << "compare - " << cards[] for(int j = 0; j < l ; j++) { int index = currentCards[j]; if(card == index) continue; if(vertices[card][index] == true) { bfs_inner(index, depth + 1, visited); } } //cout << "ending " << cards[card].rank << cards[card].suit << endl; } int bfs(int start) { bool visited[L] = {}; for(int i = 0; i < L; i++) visited[i] = false; maxBfs = 0; bfs_inner(currentCards[start], 1, visited); return maxBfs; /* printf("\n"); for(int i = 0; i < l; i++) { if (visited[currentCards[i]]) printf("%c%c ", cards[i].rank, cards[i].suit); } printf("\n"); int total = 0; for(int i = 0; i < l; i++) if(visited[i]) total++; return total; */ } int main() { initCards(); initVertices(); //printVerticesMatrix(); char rank, suit; while(cin >> l) { currentCards.clear(); for(int i = 0; i < l; i++) { cin >> rank >> suit; //cout << "a=" << rank << suit << endl; currentCards.push_back(getIndexForCard(rank, suit)); } int tmpMax = -1; int result = 0; for(int r = 0; r < l; r++) { result = bfs(r); if(result > tmpMax) tmpMax = result; } //cout << tmpMax << "\n"; if(tmpMax == l) cout << "YES" << endl; else cout << "NO" << endl; //cout << result << endl; } return 0; }