[LeetCode] Count Good Subarrays

3878. Count Good Subarrays

You are given an integer array nums.

A subarray is called good if the bitwise OR of all its elements is equal to at least one element present in that subarray.

Return the number of good subarrays in nums.

Here, the bitwise OR of two integers a and b is denoted by a | b.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
long long countGoodSubarrays(vector<int>& nums) {
int n = nums.size();
long long res = 0;
unordered_map<int,int> seen;
vector<pair<int,int>> now;
for (int r = 0; r < n; r++) {
vector<pair<int,int>> nxt{{nums[r],r}};
for (auto &p : now) {
int v = p.first | nums[r];
int b = p.second;
if (nxt.back().first == v) nxt.back().second = min(nxt.back().second, b);
else nxt.push_back({v, b});
}

swap(now,nxt);
seen[nums[r]] = r;

long long prevB = r + 1;
for (auto &p : now) {
int v = p.first;
long long L = p.second;
long long R = prevB - 1;

long long lp = -1;
if(seen.count(v)) lp = seen[v];

long long T = min(R, lp);
if (T >= L) res += (T - L + 1);

prevB = p.second;
}
}
return res;
}
};
Author: Song Hayoung
Link: https://songhayoung.github.io/2026/09/04/PS/LeetCode/count-good-subarrays/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.