bit-op我真的是肏== 真的想去黑暗一趟了
一个方法是sliding window
maintain window内各bit位置的one-count
从后面做回来
每次loop缩window,当缩到idx会让某bit位置的one-count==0,则r=idx+1
window的大小就是那个位置的最小subarr长度了
另一个方法是记下各bit位置上次出现1的idx
一样从后面做回来
nums[i]^target后,等于1的bit位置就是需要从nums[i]以后去取1的位置
遍历这些bit位置,找出上次出现1最远的位置,就会是最小subarr的右端了
def smallestSubarrays(self, nums: List[int]) -> List[int]:
        target = 0
        rets = [-1 for _ in range(len(nums))]
        bit_mem = [999999 for _ in range(32)]
        for i in range(len(nums)-1, -1, -1):
            target = target | nums[i]
            tmp = target ^ nums[i]
            j = 0
            cur_len = 1
            while tmp>0:
                if tmp&1==1:
                    cur_len = max(cur_len, bit_mem[j]-i+1)
                tmp = tmp>>1
                j += 1
            rets[i] = cur_len
            tmp = nums[i]
            j = 0
            while tmp>0:
                if tmp&1==1:
                    bit_mem[j]=min(bit_mem[j], i)
                j += 1
                tmp = tmp>>1
        return rets