⊕ 表示异或。
简化题意
有一个长度为 n 的序列 a,现在要选出 k 个互不相同的区间 [l,r] (1≤l≤r≤n),使得每一个区间的异或和最大(一个区间 [l,r] 的异或和是 al⊕al+1⊕⋯⊕ar)。
转化问题
首先设 s0=0,si 为 a1⊕a2⊕⋯⊕ai,因为 x⊕x=0,所以:
sr⊕sl−1
=a1⊕a2⊕⋯⊕ar⊕a1⊕a2⊕⋯⊕al−1
此时 a1∼al−1 都被抵消了,只剩下 al∼ar,于是一个区间 [l,r] 的异或和就等于 sl−1⊕sr。于是一个区间的异或和就变成了 sa⊕sb (0≤a<b≤n)。
这种转化是一种常见的套路,请各位务必掌握。
然后,要选出 k 个互不相同的区间并让他们的异或和最大,显然选出的区间是异或和前 k 大的几个区间。
但是要求选出的 sa⊕sb 需要满足 a<b,怎么办?
由于 a⊕b=b⊕a,所以 sa⊕sb 与 sb⊕sa 相同,我们使 k→2k,输出答案时除以二即可。
转化结果
有一个长度为 n+1 的序列 s,现在要选出 2k 个互不相同的数对 (a,b),使得每一个数对 (a,b) 的权值 sa⊕sb 之和最大。