CCCPaste

Untitled

class Solution {
public:
    vector idx, sz;
    int find_root(int A) {
        while(A != idx[A]) {
            idx[A] = idx[idx[A]];
            A = idx[A];
        }
        return A;
    }
    void merge_two_rots(int A, int B) {
        int root_a = find_root(A);
        int root_b = find_root(B);
        if(root_a == root_b) {
            return;
        }
        if(sz[root_a] < sz[root_b]) {
            idx[root_a] = idx[root_b];
            sz[root_b] += sz[root_a];
        }
        else {
            idx[root_b] = idx[root_a];
            sz[root_a] += sz[root_b];
        }
    }
    
    vector> accountsMerge(vector>& accounts) {
        int n = accounts.size();
        idx.resize(n);
        sz.resize(n);
        for(int i = 0; i < n; i++) {
            idx[i] = i;
            sz[i] = 1;
        }
        for(int i = 0; i < n; i++) {
            for(int j = 1; j < accounts[i].size(); j++) {
                for(int k = 0; k < n; k++) {
                    if(i != k) {
                        if(accounts[i][0] == accounts[k][0]) {
                            for(int l = 1; l < accounts[k].size(); l++) {
                                if(accounts[i][j] == accounts[k][l]) {
                                    merge_two_rots(i, k);
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        map> mapa;
        for(int i = 0; i < n; i++) {
            int root = find_root(i);
            for(int j = 0; j < accounts[i].size(); j++) {
                mapa[root].push_back(accounts[i][j]);
            }
        }
        vector> res;
        for(map>::iterator it = mapa.begin(); it != mapa.end(); it++) {
            set st;
            for(int i = 0; i < it->second.size(); i++) {
                if(it->second[i] != it->second[0]) {
                    st.insert(it->second[i]);
                }
            }
            vector vv;
            vv.push_back(it->second[0]);
            for(set::iterator it2 = st.begin(); it2 != st.end(); it2++) {
                vv.push_back(*it2);
            }
            res.push_back(vv);
        }
        return res;
    }
};