class Solution{public: int findFinalValue(vector<int>& nums, int original) { unordered_set<int> s(nums.begin(), nums.end()); while (s.find(original) != s.end()) { original = original * 2; } return original; }};
2. All Divisions With the Highest Score of a Binary Array
Preffix-sum.
● ● ●c++
class Solution{public: vector<int> maxScoreIndices(vector<int>& nums) { vector<int> s0 = { 0 }, s1 = { 0 }; for (auto &x : nums) { s0.push_back(s0.back() + (x == 0)); s1.push_back(s1.back() + (x == 1)); } int ans = INT_MIN; for (int i = 0; i <= nums.size(); i++) { int score = s0[i] + s1[nums.size()] - s1[i]; ans = max(score, ans); } vector<int> ret; for (int i = 0; i <= nums.size(); i++) { int score = s0[i] + s1[nums.size()] - s1[i]; if (score == ans) { ret.push_back(i); } } return ret; }};
3. Find Substring With Given Hash Value
We can get the hash value from previous hash value in O(1) time.
● ● ●c++
typedef long long ll;class Solution{public: string subStrHash(string s, int power, int modulo, int k, int hashValue) { vector<ll> pk = { 1 }; for (int i = 1; i <= k; i++) { pk.push_back(pk.back() * power % modulo); } int n = s.length(); vector<ll> sn; for (auto &c : s) { sn.push_back(c - 'a' + 1); } ll now = 0, pos = n - k; for (int i = n - k, j = 0; i < n; i++, j++) { now = (now + sn[i] * pk[j]) % modulo; } for (int i = n - k - 1; i >= 0; i--) { now = now * power + sn[i] - sn[i + k] * pk[k]; now = now % modulo; while (now < 0) { now = now + modulo; } if (now == hashValue) { pos = i; } } return s.substr(pos, k); }};
4. Groups of Strings
Bit-mask & Disjoint-set.
● ● ●c++
class Solution{public: inline int getMask(string &w) { int mask = 0; for (auto &c : w) { mask |= 1 << (c - 'a'); } return mask; } int parent[20000]; inline int getParent(int x) { return parent[x] == x ? x : (parent[x] = getParent(parent[x])); } inline void merge(int x, int y) { x = getParent(x); y = getParent(y); if (x != y) { parent[x] = y; } } vector<int> groupStrings(vector<string>& words) { int n = words.size(); vector<int> masks; for (auto &w : words) { masks.push_back(getMask(w)); } for (int x = 0; x < n; x++) { parent[x] = x; } unordered_map<int, int> idx; for (int x = 0; x < n; x++) { int mask = masks[x]; if (idx.find(mask) == idx.end()) { idx[mask] = x; } else { merge(idx[mask], x); } for (int i = 0; i < 26; i++) { if (mask & (1 << i)) { int del = mask - (1 << i); if (idx.find(del) == idx.end()) { idx[del] = x; } else { merge(x, idx[del]); } } } } unordered_map<int, int> size; int cnt = 0, max_size = 0; for (int k = 0; k < n; k++) { int x = getParent(k); if (size.find(x) == size.end()) { cnt++; size[x] = 0; } max_size = max(max_size, ++size[x]); } return vector<int>({ cnt, max_size }); }};