Advertisement
nikunjsoni

1722

Apr 29th, 2021
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.25 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     vector<int> parents;
  4.     vector<int> ranks;
  5.     int find(int a) {
  6.         if (a == parents[a])
  7.             return parents[a];
  8.         return parents[a] = find(parents[a]);
  9.     }
  10.    
  11.     void uni(int a, int b) {
  12.         a = find(a);
  13.         b = find(b);
  14.        
  15.         if (ranks[a] >= ranks[b]) {
  16.             parents[b] = a;
  17.             ranks[a]++;
  18.         }
  19.         else {
  20.             parents[a] = b;
  21.             ranks[b]++;
  22.         }
  23.     }
  24.    
  25.     int minimumHammingDistance(vector<int>& source, vector<int>& target, vector<vector<int>>& allowedSwaps) {
  26.         int n = source.size();
  27.         ranks = vector<int>(n, 0);
  28.        
  29.         for (int i = 0; i < n; i++) {
  30.             parents.push_back(i);
  31.         }
  32.        
  33.         for (auto &v : allowedSwaps)
  34.             uni(v[0], v[1]);
  35.         vector<unordered_multiset<int>> subs(n);
  36.        
  37.         for (int i = 0; i < n; i++) {
  38.             subs[find(i)].insert(source[i]);
  39.         }
  40.         int cnt = 0;
  41.         for (int i = 0; i < n; i++) {
  42.             if (!subs[parents[i]].count(target[i]))
  43.                 cnt++;
  44.             else
  45.                 subs[parents[i]].erase(subs[parents[i]].find(target[i]));
  46.         }
  47.         return cnt;
  48.     }
  49. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement