Skip to content

Commit a390784

Browse files
authored
Update k-divisible-elements-subarrays.cpp
1 parent b5e21dc commit a390784

File tree

1 file changed

+16
-23
lines changed

1 file changed

+16
-23
lines changed

C++/k-divisible-elements-subarrays.cpp

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,20 @@ class Solution2 {
7070
}
7171
return true;
7272
};
73+
vector<int> cnt(size(nums)), h(size(nums));
7374
int result = 0;
74-
auto base = P;
75-
for (int l = 1; l <= size(nums); ++l, base = (base * P) % MOD) {
75+
for (int l = 1; l <= size(nums); ++l) {
7676
unordered_map<int, vector<int>> lookup;
77-
int cnt = 0, h = 0;
78-
for (int i = 0; i < size(nums); ++i) {
79-
cnt += (nums[i] % p == 0);
80-
h = (h * P + nums[i]) % MOD;
81-
if (i - l >= 0) {
82-
cnt -= (nums[i - l] % p == 0);
83-
h = ((h - nums[i - l] * base) % MOD + MOD) % MOD;
77+
for (int i = 0; i + l - 1 < size(nums); ++i) {
78+
cnt[i] += (nums[i + l - 1] % p == 0);
79+
if (cnt[i] > k) {
80+
continue;
8481
}
85-
if (i < l - 1 || cnt > k || !check(lookup[h], l, i - l + 1)) {
82+
h[i] = (h[i] * P + nums[i + l - 1]) % MOD;
83+
if (!check(lookup[h[i]], l, i)) {
8684
continue;
8785
}
88-
lookup[h].emplace_back(i - l + 1);
86+
lookup[h[i]].emplace_back(i);
8987
++result;
9088
}
9189
}
@@ -101,22 +99,17 @@ class Solution3 {
10199
int countDistinct(vector<int>& nums, int k, int p) {
102100
static const int MOD = 1e9 + 7;
103101
static const int64_t P = 200;
102+
vector<int> cnt(size(nums)), h(size(nums));
104103
int result = 0;
105-
auto base = P;
106-
for (int l = 1; l <= size(nums); ++l, base = (base * P) % MOD) {
104+
for (int l = 1; l <= size(nums); ++l) {
107105
unordered_set<int> lookup;
108-
int cnt = 0, h = 0;
109-
for (int i = 0; i < size(nums); ++i) {
110-
cnt += (nums[i] % p == 0);
111-
h = (h * P + nums[i]) % MOD;
112-
if (i - l >= 0) {
113-
cnt -= (nums[i - l] % p == 0);
114-
h = ((h - nums[i - l] * base) % MOD + MOD) % MOD;
115-
}
116-
if (i < l - 1 || cnt > k) {
106+
for (int i = 0; i + l - 1 < size(nums); ++i) {
107+
cnt[i] += (nums[i + l - 1] % p == 0);
108+
if (cnt[i] > k) {
117109
continue;
118110
}
119-
lookup.emplace(h); // assumed no collision
111+
h[i] = (h[i] * P + nums[i + l - 1]) % MOD;
112+
lookup.emplace(h[i]);
120113
}
121114
result += size(lookup);
122115
}

0 commit comments

Comments
 (0)