首先,区间[l,r]的异或和可以是
[
1
,
r
]
x
o
r
[
1
,
l
−
1
]
[1,r]xor[1,l-1]
[1,r]xor[1,l−1]。我们可以维护一个前缀异或和,每次将它插入之前贪心得从高位向低位尽可能选择最优的值与当前值异或。做完以后将这个前缀插入01trie里面。
加强一点的:给定一个序列,多组询问,每次给定
l
,
r
,
x
l,r,x
l,r,x,求
a
i
x
o
r
x
a_i~xor~x
aixorx的最大值,
l
<
=
i
<
=
r
l<=i<=r
l<=i<=r。这个问题做一个主席树就好了。
本题,给定
b
,
x
,
l
,
r
b,x,l,r
b,x,l,r,求
b
x
o
r
(
a
i
+
x
)
b~xor~(a_i+x)
bxor(ai+x)的最大值。听上去好像很复杂,但其实和上个问题一样,只是查询数值范围减去一个x就好了。
具体来说,我们从高向低枚举每一位,假设我们匹配到了第i位,前面我们已经选了ans与b异或最大。此时这一位如果b为0,则希望找到1。查询
[
a
n
s
+
(
1
<
<
i
)
−
x
,
a
n
s
+
(
1
<
<
(
i
+
1
)
)
−
1
−
x
]
[ans+(1<<i)-x,ans+(1<<(i+1))-1-x]
[ans+(1<<i)−x,ans+(1<<(i+1))−1−x]是否有数,有就让ans当前位选1,否则选0。如果当前位为1,则希望找到0。查询
[
a
n
s
−
x
,
a
n
s
+
(
1
<
<
i
)
−
1
−
x
]
[ans-x,ans+(1<<i)-1-x]
[ans−x,ans+(1<<i)−1−x]是否有数,有就让ans当前位为0,否则为1。最后答案就是
a
n
s
x
o
r
b
ans~xor~b
ansxorb。