We have an array arr
of non-negative integers.
For every (contiguous) subarray sub = [arr[i], arr[i + 1], ..., arr[j]]
(with i <= j
), we take the bitwise OR of all the elements in sub
, obtaining a result arr[i] | arr[i + 1] | ... | arr[j]
.
Return the number of possible results. Results that occur more than once are only counted once in the final answer
Example 1:
Input: arr = [0] Output: 1 Explanation: There is only one possible result: 0.
Example 2:
Input: arr = [1,1,2] Output: 3 Explanation: The possible subarrays are [1], [1], [2], [1, 1], [1, 2], [1, 1, 2]. These yield the results 1, 1, 2, 1, 3, 3. There are 3 unique values, so the answer is 3.
Example 3:
Input: arr = [1,2,4] Output: 6 Explanation: The possible results are 1, 2, 3, 4, 6, and 7.
Constraints:
1 <= nums.length <= 5 * 104
0 <= nums[i] <= 109
class Solution:
def subarrayBitwiseORs(self, arr: List[int]) -> int:
s = set()
prev = 0
for i, v in enumerate(arr):
prev |= v
curr = 0
for j in range(i, -1, -1):
curr |= arr[j]
s.add(curr)
if curr == prev:
break
return len(s)
class Solution {
public int subarrayBitwiseORs(int[] arr) {
Set<Integer> s = new HashSet<>();
int prev = 0;
for (int i = 0; i < arr.length; ++i) {
prev |= arr[i];
int curr = 0;
for (int j = i; j >= 0; --j) {
curr |= arr[j];
s.add(curr);
if (curr == prev) {
break;
}
}
}
return s.size();
}
}
class Solution {
public:
int subarrayBitwiseORs(vector<int>& arr) {
unordered_set<int> s;
int prev = 0;
for (int i = 0; i < arr.size(); ++i) {
prev |= arr[i];
int curr = 0;
for (int j = i; ~j; --j) {
curr |= arr[j];
s.insert(curr);
if (curr == prev) break;
}
}
return s.size();
}
};
func subarrayBitwiseORs(arr []int) int {
s := map[int]bool{}
prev := 0
for i, v := range arr {
prev |= v
curr := 0
for j := i; j >= 0; j-- {
curr |= arr[j]
s[curr] = true
if curr == prev {
break
}
}
}
return len(s)
}