/***************************************************************\ * Author: Hu Wenbiao * Created Time: Sun 12 Sep 2010 08:36:41 M CST * File Name: main.cpp * Description: 延迟认可算法。 \***************************************************************/ //*========================*Head File*========================*\\ #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> /*----------------------*Global Variable*----------------------*/ struct PERSON { int cur; //对男士来说是即将表白的对象在它的列表中的位置,对女 //士来说是她现在的对象。 int rank[27]; //列表 } M[27], F[27]; int T, n, m, f, LOVE[27][27]; //F[i][j]女士i对男士j的好感度,0最高,25最低 char ch; bool exist_m[27], exist_f[27]; //*=======================*Main Program*=======================*// using namespace std; int solve(int m) { //m向M[m].rank[M[m].cur]表白,返回失恋者 f = M[m].rank[M[m].cur]; int cur = F[f].cur; if (LOVE[f][m] < LOVE[f][cur]) { F[f].cur = m; return cur; } else return m; } int main() { //freopen("input","r",stdin); scanf("%d", &T); queue < int >q; while (T--) { scanf("%d", &n); memset(M, 0, sizeof(M)); memset(F, 0, sizeof(F)); memset(exist_m, 0, sizeof(exist_m)); memset(exist_f, 0, sizeof(exist_f)); for (int i = 0; i < n; i++) { while (scanf("%c", &ch), ch < 'a' || ch > 'z'); ch -= 'a'; exist_m[ch] = true; q.push((int) ch); //男士加入单身队列 } for (int i = 0; i < n; i++) { while (scanf("%c", &ch), ch < 'A' || ch > 'Z'); ch -= 'A'; exist_f[ch] = true; } for (int i = 0; i < n; i++) { while (scanf("%c", &ch), ch < 'a' || ch > 'z'); m = ch - 'a'; for (int j = 0; j < n; j++) { while (scanf("%c", &ch), ch < 'A' || ch > 'Z'); M[m].rank[j] = ch - 'A'; } } for (int i = 0; i < n; i++) { while (scanf("%c", &ch), ch < 'A' || ch > 'Z'); f = ch - 'A'; for (int j = 0; j < n; j++) { while (scanf("%c", &ch), ch < 'a' || ch > 'z'); LOVE[f][ch - 'a'] = j; } } for (int i = 0; i < 27; i++) F[i].cur = 26; //女士对象全部初始化为26 for (int i = 0; i < 27; i++) LOVE[i][26] = 26; //女士对26的好感度最低 while (!q.empty()) { m = q.front(); q.pop(); int fail = solve(m); if (fail == 26) continue; M[fail].cur++; q.push(fail); } for (int i = 0; i < 26; i++) { if (exist_m[i]) for (int j = 0; j < 27; j++) if (F[j].cur == i) { printf("%c %c\n", 'a' + i, 'A' + j); break; } } if (T) printf("\n"); } }