思路:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<unordered_map>
#include<queue>
using namespace std;
queue <int> q;
unordered_map <char,int> mp;
const int maxn = 120;
int order[maxn][maxn],pref[maxn][maxn];
char an[maxn];
int nxt[maxn],fu_wif[maxn],fu_has[maxn];
void engage(int man,int woman){
int m = fu_has[woman];
if(m){
fu_wif[m] = 0;
q.push(m);
}
fu_wif[man] = woman;
fu_has[woman] = man;
}
int main(void)
{
char s1[30],s2[5];
int n,T,i,j,x,y;
scanf("%d",&T);
while(T--){
mp.clear();
while(!q.empty()) q.pop();
scanf("%d",&n);
for(i=1;i<=n*2;i++){
scanf("%s",s2);
mp[s2[0]] = i;
an[i] = s2[0];
}
for(i=1;i<=n;i++){
scanf("%s",s1+1);
int len = strlen(s1+1);
for(j=3;j<=len;j++){
pref[i][j-2] = mp[s1[j]];
}
nxt[i] = 1;
fu_wif[i] = 0;
q.push(i);
}
for(i=1;i<=n;i++){
scanf("%s",s1+1);
int len = strlen(s1+1);
for(j=3;j<=len;j++){
order[i+n][mp[s1[j]]] = j-2;
}
fu_has[i+n] = 0;
}
while(!q.empty()){
int man = q.front();q.pop();
int woman = pref[man][nxt[man]++];
if(!fu_has[woman]) engage(man,woman);
else if(order[woman][man]<order[woman][fu_has[woman]]) engage(man,woman);
else q.push(man);
}
for(i=1;i<=n;i++) printf("%c %c\n",an[i],an[fu_wif[i]]);
if(T) printf("\n");
}
return 0;
}