【随机双模数哈希】LeetCode 3934. 最短唯一子数组
题目
https://leetcode.cn/problems/smallest-unique-subarray/description/
参考代码
struct Hash {
static constexpr long long MOD1 = 1e9 + 7, MOD2 = 1e9 + 9;
long long base1, base2;
vector<long long> hash1, hash2, pow1, pow2;
int n;
static long long getRandomBase(long long lo, long long hi) {
static mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
uniform_int_distribution<long long> dist(lo, hi);
return dist(rng);
}
Hash(vector<int>& nums) {
base1 = getRandomBase(1e5 + 1, 1e9);
base2 = getRandomBase(1e5 + 1, 1e9);
init(nums);
}
void init(vector<int>& nums) {
n = nums.size();
hash1.resize(n + 1);
hash2.resize(n + 1);
pow1.resize(n + 1);
pow2.resize(n + 1);
pow1[0] = pow2[0] = 1;
for (int i = 1; i <= n; ++ i) {
pow1[i] = pow1[i - 1] * base1 % MOD1;
pow2[i] = pow2[i - 1] * base2 % MOD2;
}
for (int i = 0; i < n; ++ i) {
hash1[i + 1] = (hash1[i] * base1 + nums[i]) % MOD1;
hash2[i + 1] = (hash2[i] * base2 + nums[i]) % MOD2;
}
}
pair<long long, long long> getHash(int l, int r) {//[l, r],下标要从 1 开始
long long h1 = (hash1[r + 1] - hash1[l] * pow1[r - l + 1] % MOD1 + MOD1) % MOD1;
long long h2 = (hash2[r + 1] - hash2[l] * pow2[r - l + 1] % MOD2 + MOD2) % MOD2;
return {h1, h2};
}
};
class Solution {
public:
int smallestUniqueSubarray(vector<int>& nums) {
int n = nums.size();
Hash hash(nums);
int l = 1, r = n, m;
auto check = [&](int len) -> bool {
map<pair<long long, long long>, int> mp;
for (int i = len - 1; i < n; ++ i) {
auto h = hash.getHash(i - len + 1, i);
mp[h] ++;
}
for (auto &[_, v]: mp) {
if (v == 1) return false;
}
return true;
};
while (l < r) {
m = l + r >> 1;
if (check(m)) l = m + 1;
else r = m;
}
return l;
}
};
浙公网安备 33010602011771号