题目
我们有一个非负整数数组 A。
对于每个(连续的)子数组 B = [A[i], A[i+1], …, A[j]] ( i <= j),我们对 B 中的每个元素进行按位或操作,获得结果 A[i] | A[i+1] | … | A[j]。
返回可能结果的数量。 (多次出现的结果在最终答案中仅计算一次。)
子数组按位或运算
class Solution {
public:
int subarrayBitwiseORs(vector<int>& arr) {
int n = arr.size(), pre = 0;
unordered_set<int> ans;
for(int i = 0;i < n;i++){
int cnt = arr[i];
for(int j = i;j >= 0;j--){
while(j > 0 && arr[j] == arr[j - 1]) j--;
cnt = cnt | arr[j];
ans.insert(cnt);
if((cnt & pre) == pre) break;
}
pre |= arr[i];
}
return ans.size();
}
};