题解:对一组从0开始累加1的数,列出它们的二进制表示,会发现,每一位的0的总数一定是大于1的总数的。以0~7为例:
因此,因为题中给出的输入,即经x按位异或后的数组a,一定是从0~n的原数组合法变换过来的,那么复原后,原数组一定符合前述规律。所谓复原,无非就是把x的第i位取1,使数组a中每个数的第i位取反——这会使0的综述与1的总数的大小关系变换;或者把x的第i位取0,这样数组a中每个数的第i位不变。对每一位,这两种操作取其一。
因此,
- 如果a中第i位0的个数大于1的个数,则x的第i位只能取0;
- 如果a中第i位的0的个数小于1的个数,则x的第i位只能取1;
- 如果a中第i位0的个数等于1的个数,则x第i位随意。
第3点的粗浅证明:只有当数的个数为2的倍数时,才有可能在第i位上有0的个数等于1的个数。这意味着,原数组为{0~2^t-1},它们所有数是每个位上取0或1的全排列。