Given an array of integers nums and an integer k, return the number of subarrays of nums where the bitwise AND of the elements of the subarray equals k.
Example 1:
1 2 3
Input: nums = [1,1,1], k = 1
Output: 6
Explanation:
All subarrays contain only 1’s.
Example 2:
1 2 3
Input: nums = [1,1,2], k = 1
Output: 3
Explanation:
Subarrays having an AND value of 1 are: [1 ,1,2], [1,1 ,2], [1,1 ,2].
Example 3:
1 2 3
Input: nums = [1,2,3], k = 2
Output: 2
Explanation:
Subarrays having an AND value of 2 are: [1,2,3], [1,2,3 ].
classSolution { public: longlongcountSubarrays(vector<int>& nums, int k){ int n = nums.size(); longlong res = 0; for (int i = 0; i < n; i++) { int x = nums[i]; for (int j = i - 1; j >= 0; j--) { if ((nums[j] & x) == nums[j]) { break; } nums[j] &= x; } int left = findLeft(nums, 0, i, k); int right = findRight(nums, 0, i, k); res += right - left; } return res; }
intfindLeft(vector<int>& nums, int low, int high, int k){ int left = low, right = high; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == k) { right = mid - 1; } elseif (nums[mid] < k) { left = mid + 1; } else { right = mid - 1; } } return left; }
intfindRight(vector<int>& nums, int low, int high, int k){ int left = low, right = high; while (left <= right) { int mid = (left + right) / 2; if (nums[mid] == k) { left = mid + 1; } elseif (nums[mid] < k) { left = mid + 1; } else { right = mid - 1; } } return left; } };