Ejemplo n.º 1
0
int main() {
    for(cin >> T; T--;) {
        cin >> N >> ws;
        A.clear();
        B.clear();
        nA = nB = "";
        for(int i = 0; i < N; ++i) {
            char c;
            cin >> c;
            nA += c;
            A[c] = i;
        }
        for(int i = 0; i < N; ++i) {
            char c;
            cin >> c;
            nB += c;
            B[c] = i;
        }
        vector<vector<int> > X(N), Y(N);
        for(int i = 0; i < N; ++i) {
            string s;
            cin >> s;
            for(int k = 2, j = A[s[0]]; k < s.size(); ++k)
                X[j].push_back(B[s[k]]);
        }
        for(int i = 0; i < N; ++i) {
            string s;
            cin >> s;
            for(int k = 2, j = B[s[0]]; k < s.size(); ++k)
                Y[j].push_back(A[s[k]]);
        }
        StableMarriage obj;
        vector<pair<int, int> > ans = obj.getMatch(X, Y);
        vector<string> ss(0);
        for(int i = 0; i < ans.size(); ++i) {
            string tmp("");
            tmp += nA[ans[i].first];
            tmp += ' ';
            tmp += nB[ans[i].second];
            ss.push_back(tmp);
        }
        sort(ss.begin(), ss.end());
        for(int i = 0; i < ss.size(); ++i)
            cout << ss[i] << endl;
        if(T) cout << endl;
    }
}
Ejemplo n.º 2
0
int main() {
	int cs;
	scanf("%d", &cs);
	while(cs--) {
		int n;
		IDGen<char> mid, wid;
		char let[64];
		scanf("%d", &n);
		for(int i = 0; i < n; ++i) {
			scanf("%s", let);
			mid.getId(let[0]);
		}
		for(int i = 0; i < n; ++i) {
			scanf("%s", let);
			wid.getId(let[0]);
		}
		StableMarriage sm;
		sm.init(n);
		for(int i = 0; i < n; ++i) {
			scanf("%s", let);
			int m = mid.getId(let[0]);
			for(int j = 2; let[j]; ++j) {
				int w = wid.getId(let[j]);
				sm.add('m', m, j - 2, w);
			}
		}
		for(int i = 0; i < n; ++i) {
			scanf("%s", let);
			int w = wid.getId(let[0]);
			for(int j = 2; let[j]; ++j) {
				int m = mid.getId(let[j]);
				sm.add('w', w, j - 2, m);
			}
		}
		sm.stableMatch();
		vector<pair<char, char> > vp;
		for(int i = 0; i < n; ++i) {
			char m, w;
			m = mid.getElem(i);
			w = wid.getElem(sm.getMatch(i));
			vp.push_back(make_pair(m, w));
		}
		sort(vp.begin(), vp.end());
		for(int i = 0; i < vp.size(); ++i) {
			printf("%c %c\n", vp[i].first, vp[i].second);
		}
		if(cs != 0)
			putchar('\n');
	}
}