#include #include #include #include #include #include #include using std::vector; using std::cout; using std::endl; using std::cin; using std::string; void getGrid(vector>& g ) { int rows = 6; int cols = 5; for (int i = 0; i < rows; i++) { vector row; g.push_back(row); } for (int i = 0; i < rows; i++) { string s; std::getline(cin, s); for (int j = 0; j < cols; j++) { string c = ""; c += s[j]; g[j].push_back(c); } } for (int i = 0; i < rows; i++) { std::sort(g[i].begin(), g[i].end()); } } void getCommon(const vector>& a, const vector>& b, vector>& f) { for (int i = 0; i < 5; i++) { vector col; f.push_back(col); vector::const_iterator it_a = a[i].begin(); vector::const_iterator it_b = b[i].begin(); while (it_a != a[i].end() && it_b != b[i].end()) { if (it_a != a[i].begin() && *it_a == *(it_a-1) ) { it_a++; } else if ( *it_a == *it_b ) { string c = ""; c += *it_a; f[i].push_back(c); it_a++; it_b++; } else if ( *it_a < *it_b ) { it_a++; } else { it_b++; } } } } void printSol(const int K, const vector>& g, const int tot, const vector& prd_cmb) { /* cout << "Entering PRINTSOL" << endl; for (int i = 0; i < (int)g.size(); i++) { for (int j = 0; j < (int)g[i].size(); j++) { cout << g[i][j]; } cout << endl; } cout << endl; cout << "Tot: " << tot << endl; cout << "K: " << K << endl; */ int rem = K - 1; vector removed; for (int k = 0; k < 5; k++) { int q = 0; removed.push_back(q); } if (tot < K || tot == 0) { cout << "NO" << endl; } else { int i = 0; while (rem != 0) { if (rem < prd_cmb[i]) { i++; } else { rem -= prd_cmb[i]; removed[i] += 1; i = 0; } } for (int i = 0; i < 5; i++) { /* cout << endl << "i: " << i << endl; cout << "rem[i]: " << removed[i] << endl; cout << "print" << endl; */ cout << g[i][removed[i]]; } cout << endl; } // cout << "Exiting PRINTSOL" << endl; } void testCase() { int K; cin >> K; string s; std::getline(cin,s); //Throw away rest of line so getGrid is not confused vector> g1; getGrid(g1); vector> g2; getGrid(g2); vector> g3; getCommon(g1, g2, g3); if (g3.size() != 0) { vector num_e; vector comb_e; for (int i = 0; i < 5; i++) { num_e.push_back(g3[i].size()); } int combs = 1; for (int i = 4; 0 < i; i--) { combs *= num_e[i]; vector::iterator it; it = comb_e.begin(); comb_e.insert(it, combs); } comb_e.push_back(1); combs *= num_e[0]; for (int i = 0; i < (int)g3.size(); i++) { if (g3[i].size() <= 0) { cout << "NO" << endl; return; } } printSol(K, g3, combs, comb_e); } else { cout << "NO" << endl; } } int main() { int nTests; cin >> nTests; for (int tI = 0; tI < nTests; tI++) { testCase(); } // cout << endl; return 0; }