算法 {二进制或|}
或|
性质
若干数{Ai}
的|
或运算 结果为T
, 则一定有: Ai <= T
;
@DELI;
@MARK_1
;
对于数组A[1,2,3,...,N]
(每个元素是[0, 2^31]
范围), 令一个数组的价值为所有元素的或|运算的结果
; 那么所有以A[N]
为结尾的子数组(有N
个), 这些子数组 他们的价值 最多只有32
种可能;
.
即对于所有的i=[1-N]: | Set{ Val( A[i - N] ) } | <= 32
;
证明: 当i==N
时, 假设A[N]二进制有X个0
, &or: A[i...N]的|结果
, 那么随着你i --
往左移动, 此时的A[i-N]的结果
要么等于&or
要么是将&or
里的若干个0
给变成了1
; 即最初A[N]
有X个0
, 那么其实所有子数组的价值 最多只有X
个取值;
.
不要以为是X个0
的选与不选, 这是错误的; 比如当i==N
时 or = A[N] = 100100
, 然后当i == N-1
时 可能or = 100110
, 然后i == N-2
可能or = 100111
, 然后i == N-3
可能and = 111111
, 于是对于i <= N-3
其or == 111111
;