898. Bitwise ORs of Subarrays 子数组按位或操作

@TOC

# 题目描述

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`

# 解题方法

# 动态规划

dp[i]的大小至多是32个，即 |dp[i]| <= 32 的证明：

dp[i] = {A[i], A[i] | A[i - 1], A[i] | A[i - 1] | A[i - 2], ... , A[i] | A[i - 1] | ... | A[0]}，这个序列单调递增，通过把A[i]中的0变成1。A[i]最多有32个0。所以这个集合的大小 <= 32。

``````class Solution(object):
def subarrayBitwiseORs(self, A):
"""
:type A: List[int]
:rtype: int
"""
res = set()
cur = set()
for a in A:
cur = {n | a for n in cur} | {a}
res |= cur
return len(res)
``````

# 日期

2018 年 10 月 28 日 —— 10月份最后一个周一