898.Bitwise ORs of Subarrays

We have an array A of non-negative integers.

For every (contiguous) subarray B = [A[i], A[i+1], ..., A[j]] (with i <= j), we take the bitwise OR of all the elements in B, obtaining a result A[i] | A[i+1] | ... | A[j].

Return the number of possible results. (Results that occur more than once are only counted once in the final answer.)

Example 1:

Input: [0]
Output: 1
Explanation:
There is only one possible result: 0.

Example 2:

Input: [1,1,2]
Output: 3
Explanation:
The possible subarrays are [1], [1], [2], [1, 1], [1, 2], [1, 1, 2].
These yield the results 1, 1, 2, 1, 3, 3.
There are 3 unique values, so the answer is 3.

Example 3:

Input: [1,2,4]
Output: 6
Explanation:
The possible results are 1, 2, 3, 4, 6, and 7.

Note:

  1. 1 <= A.length <= 50000
  2. 0 <= A[i] <= 10^9

Solution1:(TLE)

class Solution:
    def subarrayBitwiseORs(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        s = set()
        for i in range(len(A)): #start with i
            for j in range(i,len(A)): #end with j
                res = A[i]
                for t in range(i+1,j+1):
                    res = res | A[t]
                s.add(res)
        return len(s)

65 / 83 test cases passed.
O(n3)
Solution2:(TLE)

class Solution:
    def subarrayBitwiseORs(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        s = set()
        for i in range(len(A)): #start with i
            for j in range(i,len(A)): #end with j
                subarray = set(A[i:j+1])
                res = 0
                for t in subarray:
                    res = res | t
                s.add(res)
        return len(s)

65 / 83 test cases passed.
a little optimization, remove the same elements in subarray.
O(n3)

Solution3:(TLE)

class Solution:
    def subarrayBitwiseORs(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        s = set()
        for i in range(len(A)): #start with i
            temp = A[i]
            for j in range(i,len(A)): #end with j
                temp = temp | A[j]
                s.add(temp)
        return len(s)

70 / 83 test cases passed.
Similar with prefix sum,still can't work.
O(n2)

Solution4:

class Solution:
    def subarrayBitwiseORs(self, A):
        """
        :type A: List[int]
        :rtype: int
        """
        s1 = set()
        s1.add(A[0])
        res = set(A)
        for i in range(1,len(A)):
            s2 = set()
            for t in s1:
                s2.add(t|A[i])
            s2.add(A[i])
            for t in s2:
                res.add(t)
            s1 = s2 #保存到i的所有或的结果
        return len(res)