我们可以多次选择当前数组中的某个数 x,把所有元素同时变为 a_i xor x。关键观察:
g。x=a_k,则 g=a_k;第二步必须从新数组中选 x'=a_j xor a_k,于是新的整体异或量变为 g'=a_k xor (a_j xor a_k)=a_j;继续下去可证明每一步后的整体异或量始终是原数组中的某个元素。{a_i xor g},其中 g ∈ {0} ∪ {a_1,…,a_n}(允许不操作时 g=0)。于是问题化简为:在有限候选集合 G={0} ∪ {a_i} 中,选择 g 最大化
给定一个由 n 个非负整数构成的数组 {a1,a2,…,an} 。你可以进行以下操作任意次(可以不执行任何操作):
你的目标是使操作后数组中所有元素之和最大化,输出该最大值。
【名词解释】
xor :指位运算中的按位异或运算。
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤2×105) 代表数据组数,每组测试数据描述如下:
第一行输入一个整数 n(1≦n≦2×105) 表示数组中元素的个数。
第二行输入 n 个整数 a1,a2,…,an(0≦ai≦109) ,表示数组中的元素。
除此之外,保证单个测试文件的几之和不超过 2×105 。
对于每组测试数据,新起一行,输出一个整数,表示经过若干次操作后数组元素之和的最大值。
输入
3
3
2 3 4
6
1 1 4 5 1 4
7
1 9 1 9 8 1 0
输出
13
16
37
说明
对于第一组测试数据,最优方案为选择 x=a3=4 ,操作后数组变为 {6,7,0},数组元素之和为 13 。可以证明,这是可以达到的最大值。