zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    [Codeforces 1214A]Optimal Currency Exchange(贪心)
    [Codeforces 1214D]Treasure Island(dfs)
    [BZOJ 3512]DZY Loves Math IV(杜教筛)
    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
    [BZOJ 2154]Crash的数字表格(莫比乌斯反演)
    【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap
    【状态压缩DP】BZOJ1087-[SCOI2005]互不侵犯King
    【概率DP】BZOJ4318-OSU!
    【最大权闭合子图/最小割】BZOJ3438-小M的作物【待填】
    【莫比乌斯反演】HDU1695_GCD
  • 原文地址:https://www.cnblogs.com/bernieloveslife/p/9755302.html
Copyright © 2011-2022 走看看