贴几个博客链接,模板自用…
https://www.cnblogs.com/encodetalker/p/11001087.html
https://blog.csdn.net/lifajun90/article/details/8659192
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn=20005;
const int maxm=100005;
const int inf=0x3f3f3f3f;
map<char,int> M[2];
map<int,char> R[2];
char op[35];
int n,ct[2],like[2][30][30];
int Mat[2][30],rk[30];
int gain(char x,int f){
if(!M[f][x]) {
M[f][x]=++ct[f];
R[f][ct[f]]=x;
}
return M[f][x];
}
void deal(){
rep(i,1,n) rk[i]=Mat[0][i]=Mat[1][i]=0;
while(1){
int flag=1;
for(int i=1;i<=n;i++){
if(!Mat[0][i]){
flag=0;
int a=like[0][i][++rk[i]];
//选取这个男生下一个喜欢的女生
if(!Mat[1][a]){
//如果这个女生此时没有配偶
Mat[1][a]=i;
Mat[0][i]=a;
}
else if(like[1][a][i]>like[1][a][Mat[1][a]]){
//如果这个女生有配偶 但是喜欢That Man不如喜欢现在追她的这个
Mat[0][Mat[1][a]]=0;
Mat[1][a]=i;
Mat[0][i]=a;
}
}
}
if(flag) break;
}
for(int i=1;i<=n;i++){
printf("%c %c\n",R[0][i],R[1][Mat[0][i]]);
}
}
int main(){
int T; scanf("%d",&T);
while(T--){
rep(i,0,1) M[i].clear(),R[i].clear();
ct[0]=ct[1]=0;
scanf("%d",&n);
rep(i,1,n) scanf("%s",op+1),gain(op[1],0);
rep(i,1,n) scanf("%s",op+1),gain(op[1],1);
rep(i,1,n){
scanf("%s",op+1);
int idm=gain(op[1],0);
rep(j,3,n+2){
like[0][idm][j-2]=gain(op[j],1);
//对男生来说 标记自己第i个喜爱的女生是谁
}
}
rep(i,1,n){
scanf("%s",op+1);
int idf=gain(op[1],1);
rep(j,3,n+2){
int idm=gain(op[j],0);
like[1][idf][idm]=n-j+3;
//对女生来说 标记这个男生在她这里的喜爱程度
}
}
deal();
if(T>0) printf("\n");
}
return 0;
}