<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>

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        N = len(nums)
        kBinary = [0] * 32
        ktmp = k
        i = 0
        zeroCount = 32
        while ktmp:
            kBinary[i] = ktmp % 2
            if ktmp % 2:
                zeroCount -= 1
            ktmp >>= 1
            i += 1 

        def hasAllOnes(num):
            for bit in kBinary:
                if bit and num % 2 == 0:
                    return False
                num >>= 1
            return True

        def slidingWindow(starti, streak):
            right = -1
            sub = 0
            zeroCounts = [0] * 32
            coverage = 0
            for offset in range(streak):
                while right < streak - 1 and coverage != zeroCount:
                    right += 1
                    tmp = nums[starti + right]
                    for i in range(32):
                        if kBinary[i] == 0 and tmp % 2 == 0:
                            zeroCounts[i] += 1
                            if zeroCounts[i] == 1:
                                coverage += 1
                        tmp >>= 1
                if coverage == zeroCount:
                    sub += streak - right 
                
                tmp = nums[starti + offset]
                for i in range(32):
                    if kBinary[i] == 0 and tmp % 2 == 0:
                        zeroCounts[i] -= 1
                        if zeroCounts[i] == 0:
                            coverage -= 1
                    tmp >>= 1
            
            return sub

        res = 0
        starti = 0
        streak = 0
        for i in range(N + 1):
            if i < N and hasAllOnes(nums[i]):
                streak += 1
            else:
                res += slidingWindow(starti, streak)
                starti = i + 1
                streak = 0

        return res
3890