@@ -70,22 +70,20 @@ class Solution2 {
70
70
}
71
71
return true ;
72
72
};
73
+ vector<int > cnt (size (nums)), h (size (nums));
73
74
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) {
76
76
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 ;
84
81
}
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)) {
86
84
continue ;
87
85
}
88
- lookup[h] .emplace_back (i - l + 1 );
86
+ lookup[h[i]] .emplace_back (i);
89
87
++result;
90
88
}
91
89
}
@@ -101,22 +99,17 @@ class Solution3 {
101
99
int countDistinct (vector<int >& nums, int k, int p) {
102
100
static const int MOD = 1e9 + 7 ;
103
101
static const int64_t P = 200 ;
102
+ vector<int > cnt (size (nums)), h (size (nums));
104
103
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) {
107
105
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) {
117
109
continue ;
118
110
}
119
- lookup.emplace (h); // assumed no collision
111
+ h[i] = (h[i] * P + nums[i + l - 1 ]) % MOD;
112
+ lookup.emplace (h[i]);
120
113
}
121
114
result += size (lookup);
122
115
}
0 commit comments