#include <iostream> #include <map> #include <stdio.h> #include <string> #include <string.h> #include <vector> #include <algorithm> using namespace std; map<string,int> cat; map<string,int> an; map<int,string> _cat; map<int,string> _an; vector<string> vb[110]; vector<int> vcat,ancat; int pri_cat[110][110]; int pri_an[110][110]; string s[110]; string S1[110],S2[110]; int Nc,Na,mix; struct msr{ int weight; int pos; }pwr[110]; bool cmp(msr a,msr b) { return a.weight>b.weight; } int StableMarriage() { bool mCat[110]; int fAn[110]; int p; map<int,string> couple; int freeCount=vcat.size(); for(int i=0;i<vcat.size();i++) { mCat[i]=true; fAn[i]=-1; } while(freeCount>0) { int m; if(freeCount==0) break; for(int i=0;i<vcat.size();i++) { if(mCat[i]==true) { m=vcat[i]; p=i; break; } } for(int i=0;i<ancat.size();i++) { pwr[i].weight=pri_cat[m][ancat[i]]; pwr[i].pos=i; } sort(pwr,pwr+ancat.size(),cmp); while(mCat[p]) { int w=0; int select_an; //cout<<pwr[0].weight<<" "<<pwr[0].pos<<"\n"; //getchar(); for(int z=0;z<ancat.size();z++) { select_an=pwr[z].pos; if(fAn[select_an]==-1) { fAn[select_an]=p; mCat[p]=false; freeCount--; string st=_cat[vcat[p]]; st.append(_an[ancat[select_an]]); couple[p+1]=""; //cout<<st<<" "<<p+1<<"\n"; //if(freeCount!=0) couple[p+1]=st; break; } else { int m1=fAn[select_an]; if(pri_an[ancat[select_an]][m]>pri_an[ancat[select_an]][vcat[m1]]) { mCat[p]=false; mCat[m1]=true; fAn[select_an]=p; string st=_cat[vcat[p]]; st.append(_an[ancat[select_an]]); //if(freeCount!=0) couple[p+1]=st; //cout<<st<<" = "<<p+1<<"\n"; break; } } } if(mCat[p]==false) break; } } int cntr=0; for(map<int,string>::iterator it=couple.begin();it!=couple.end();++it) { if(cntr<=mix-2) cout<<it->second<<" "; else cout<<it->second; cntr+=1; } cout<<"\n\n"; return 0; } int main() { int a,c=0,m; string str; while(cin>>Nc) { if(Nc==0) break; c+=1; cat.clear(); an.clear(); int k=1; for(int i=0;i<Nc;i++) { cin>>str; if(cat[str]==0) { cat[str]=k; _cat[k-1]=str; k++; } } cin>>Na; k=1; for(int i=0;i<Na;i++) { cin>>str; if(an[str]==0) { an[str]=k; _an[k-1]=str; k++; } } for(int i=0;i<Nc;i++) { for(int j=0;j<Na;j++) { cin>>a; pri_cat[i][j]=a; } } for(int i=0;i<Na;i++) { for(int j=0;j<Nc;j++) { cin>>a; pri_an[i][j]=a; } } m=0; while(cin>>mix) { if(mix==0) break; m+=1; _an.clear(); _cat.clear(); vcat.clear(); ancat.clear(); for(int i=0;i<mix;i++) { cin>>s[i]; S1[i]=""; S2[i]=""; S1[i].append(1u,s[i][0]); S1[i].append(1u,s[i][1]); int y=cat[S1[i]]; _cat[y-1]=S1[i]; vcat.push_back(y-1); S2[i].append(1u,s[i][2]); S2[i].append(1u,s[i][3]); y=an[S2[i]]; _an[y-1]=S2[i]; ancat.push_back(y-1); } cout<<"Scenario "<<c<<", Mixture "<<m<<":\n"; StableMarriage(); } }//end while return 0; }