\oplus 表示异或。

简化题意

有一个长度为 nn 的序列 aa,现在要选出 kk 个互不相同的区间 [l,r] (1lrn)[l, r] \ (1 \le l \le r \le n),使得每一个区间的异或和最大(一个区间 [l,r][l, r] 的异或和是 alal+1ara_l \oplus a_{l + 1} \oplus \cdots \oplus a_r)。

转化问题

首先设 s0=0,sis_0 = 0, s_ia1a2aia_1 \oplus a_2 \oplus \cdots \oplus a_i,因为 xx=0x \oplus x = 0,所以:

srsl1s_r \oplus s_{l - 1}

=a1a2ara1a2al1= a_1 \oplus a_2 \oplus \cdots \oplus a_r \oplus a_1 \oplus a_2 \oplus \cdots \oplus a_{l - 1}

此时 a1al1a_1 \sim a_{l - 1} 都被抵消了,只剩下 alara_l \sim a_r,于是一个区间 [l,r][l, r] 的异或和就等于 sl1srs_{l - 1} \oplus s_r。于是一个区间的异或和就变成了 sasb (0a<bn)s_a \oplus s_b \ (0 \le a < b \le n)

这种转化是一种常见的套路,请各位务必掌握。

然后,要选出 kk 个互不相同的区间并让他们的异或和最大,显然选出的区间是异或和前 kk 大的几个区间。

但是要求选出的 sasbs_a \oplus s_b 需要满足 a<ba < b,怎么办?

由于 ab=baa \oplus b = b \oplus a,所以 sasbs_a \oplus s_bsbsas_b \oplus s_a 相同,我们使 k2kk \to 2k,输出答案时除以二即可。

转化结果

有一个长度为 n+1n + 1 的序列 ss,现在要选出 2k2k 个互不相同的数对 (a,b)(a, b),使得每一个数对 (a,b)(a, b) 的权值 sasbs_a \oplus s_b 之和最大。