对于数组:
0
,
1
,
2
,
.
.
.
[
l
,
.
.
.
,
m
i
d
,
.
.
.
,
r
]
,
且
‘
r
−
l
+
1
‘
为偶数
0, 1, 2, ... [l, ..., mid, ..., r], 且`r-l+1`为偶数
0,1,2,...[l,...,mid,...,r],且‘r−l+1‘为偶数,
记
a
l
l
=
[
0
,
1
,
.
.
.
,
r
]
的异或和
,
p
r
e
=
[
0
,
1
,
.
.
.
,
l
−
1
]
的异或和
,
l
e
f
=
[
l
,
.
.
.
,
m
i
d
]
的异或和
,
r
i
g
=
[
m
i
d
+
1
,
.
.
,
r
]
的异或和
all = [0, 1, ..., r]的异或和, pre = [0, 1, ..., l-1]的异或和, lef = [l, ..., mid]的异或和, rig = [mid+1, .., r]的异或和
all=[0,1,...,r]的异或和,pre=[0,1,...,l−1]的异或和,lef=[l,...,mid]的异或和,rig=[mid+1,..,r]的异或和
如果lef == rig
, 则lef ^ rig = 0
, 推出
→
\rightarrow
→ [l, ..., r]
的异或和为0
即:
(
l
e
f
=
r
i
g
)
→
(
[
l
,
.
.
.
,
r
]
的异或和为
0
)
(lef = rig) \rightarrow ([l, ..., r]的异或和为0)
(lef=rig)→([l,...,r]的异或和为0)
但反过来是否成立呢?
根据 参见 的 异或和为0
的任意可拆分性
如果[l, ..., r]
的异或和为0
, 则一定有: [l, ..., mid]
的异或和 等于 [mid+1, ..., r]
的异或和
因此, 以r
为结尾的 满足要求的区间 (也就是[l, ... r]
), 此时满足: all == pre
, 因此, 用map记录, 找所有pre
为all
的个数即可.
下标从0开始, odd
为 所有 奇数下标的 异或前缀和; even
为 所有 偶数下标的异或前缀和.
但一定要注意, 比如对于r
为偶数的情况: [0, 1, 2, 3, 4, 5, 6]
, 他的所有可能的答案区间: [5, 6]
[3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
即, 他的pre
, 一定是存在的, 长度>= 1
; 因为, 区间左端点最极限取到1
, 而1
的左侧还有0
但是, 对于r
为奇数: [0, 1, 2, 3]
, 他的区间: [2, 3]
[0, 1, 2, 3]
对于[0, 1, 2, 3]
, 他的pre
应该为0
, 但是, sum[ l - 1]
是不存在的, 即他的pre, 已经越界了!!!
因此, 对于前缀和 [l, r]
区间问题, 一定要注意: 边界情况; 当l == 0
时, 此时的sum[ r] - sum[ l - 1]
中的, l-1
是不存在的
因此, 要提前加入: odd[ 0] = 1