<p>Given an array of integers <code>nums</code> and an integer <code>k</code>, return the number of <span data-keyword="subarray-nonempty">subarrays</span> of <code>nums</code> where the bitwise <code>AND</code> of the elements of the subarray equals <code>k</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">nums = [1,1,1], k = 1</span></p>

<p><strong>Output:</strong> <span class="example-io">6</span></p>

<p><strong>Explanation:</strong></p>

<p>All subarrays contain only 1&#39;s.</p>
</div>

<p><strong class="example">Example 2:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">nums = [1,1,2], k = 1</span></p>

<p><strong>Output:</strong> <span class="example-io">3</span></p>

<p><strong>Explanation:</strong></p>

<p>Subarrays having an <code>AND</code> value of 1 are: <code>[<u><strong>1</strong></u>,1,2]</code>, <code>[1,<u><strong>1</strong></u>,2]</code>, <code>[<u><strong>1,1</strong></u>,2]</code>.</p>
</div>

<p><strong class="example">Example 3:</strong></p>

<div class="example-block">
<p><strong>Input:</strong> <span class="example-io">nums = [1,2,3], k = 2</span></p>

<p><strong>Output:</strong> <span class="example-io">2</span></p>

<p><strong>Explanation:</strong></p>

<p>Subarrays having an <code>AND</code> value of 2 are: <code>[1,<b><u>2</u></b>,3]</code>, <code>[1,<u><strong>2,3</strong></u>]</code>.</p>
</div>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= nums[i], k &lt;= 10<sup>9</sup></code></li>
</ul>

def isContains(mask, checker): return mask & checker == checker
def allSetBits(x, MAXB=32):
    return [bit for bit in range(MAXB) if x & (1<<bit)]

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        # Take only num that contiains the k as a subset
        # Want exact and to be k so there should be atleast one k
        # Find the valid subarrays that ends at i such that their xor is k
        
        n = len(nums)
        
        last = [-1]*32  # last[i] : last pos where bit i is unset
        prevI = 0
        res = 0
        for i in range(n):
            # Add ith 
            x = nums[i]
            if not isContains(x, k):  # x does not contain the k no subarray will end at the i
                prevI = i+1
                continue
            
            # Upadate last
            for bit in range(32):
                if not x & (1<<bit):
                    last[bit] = i
            
            # first index to the left of i such that the xor of subarray from it to i is equal to k
            # i.e want to remove the remaining bits from the x other than the k number set bits
            removal = allSetBits(x ^ k)   
            prevK = i
            for bit in removal:
                prevK = min(prevK, last[bit])
            
            
            
            tot = i - prevI + 1  # [prevI,.......i]
            invalids = i - prevK  # (prevK, i]
            res += max(0, tot-invalids)
        
        return res
            
            
                
                
2139