题解见这篇文章
当 b 1 b_1 b1确定的时候,我们如何查询最大值?见最大异或对
当然,也有另一种思路,就是按位考虑
一样的,我们通过模拟位,可以知道 b i b_i bi( i ≥ 2 i≥2 i≥2)与 b 1 b_1 b1的每一位的异同,所以我们确定了 b 1 b_1 b1就确定了所有 b i b_i bi,然而我们却不能确定 b 1 b_1 b1,我们也没办法枚举 b 1 b_1 b1,不然时间复杂度太大了
这个时候我们尝试一下样例。我们直接令
b
1
=
0
b_1=0
b1=0,然后跑样例,跑出来的
6
6
6个数是0 1 7 6 2 3
写成二进制就是
000
001
111
110
010
011
我们来看看样例输出给的每个二进制
010
011
101
100
000
001
观察两组数的不同,发现在每一位上有可能 0 0 0和 1 1 1互换(原来是 0 0 0的地方全变成了 1 1 1,原来是 1 1 1的地方全变成了 0 0 0)
我们又想到,题目最终要求的是 [ 0 , n − 1 ] [0,n-1] [0,n−1],所以每一位的 0 0 0和 1 1 1的总个数是确定的
那么如果我们最开始求出来的这组数在某一位上的 1 1 1的个数与最终的 1 1 1的个数不同,那么我们直接将 0 0 0的地方全变成 1 1 1, 1 1 1的地方全变成 0 0 0就好了;如果相同的话,这个时候变不变是没有影响的,因为就相当于原来的某两个数交换了一下位置(比如原来第 2 2 2个数是 010 010 010,第 5 5 5个数是 000 000 000,然后我们现在把从右往左第二位取反,那么取反之后就是第 2 2 2个数变成了 000 000 000,第 5 5 5个数变成了 010 010 010),显然不影响答案