6
if (a == parents[a]) return parents[a];7
return parents[a] = find(parents[a]);10
void uni(int a, int b) {14
if (ranks[a] >= ranks[b]) {23
int minimumHammingDistance(vector<int> &source, vector<int> &target,24
vector<vector<int>> &allowedSwaps) {25
int n = source.size();26
ranks = vector<int>(n, 0);28
for (int i = 0; i < n; i++) {32
for (auto &v : allowedSwaps) uni(v[0], v[1]);33
vector<unordered_multiset<int>> subs(n);35
for (int i = 0; i < n; i++) {36
subs[find(i)].insert(source[i]);39
for (int i = 0; i < n; i++) {40
if (!subs[parents[i]].count(target[i]))43
subs[parents[i]].erase(subs[parents[i]].find(target[i]));