【转载】线性基的更多操作!
查询某个数
转自帅到报警
就是查找某个数是否可以由这 n 个数中任一个数异或得到。首先还是刚才那个定理:线性基的值域与原数组的值域相同。
还有我们要发现一个性质:如果 x1 ^ x1 = x3, 那么 x3 ^ x2 = x1,且 x3 ^ x1 = x2(可以自己证明一下)。
我们也是从低到高扫这个数的每一位,如果这第 i 位为 1,就异或上 Pi,然后知道处理到最后一位。如果变成 0 了,那么就是可以的。
查询最值
转自Marser
最大值可以用贪心的思想来做。
从高到低遍历数组,如果ans第i位的那个数后大于ans,则这个数,因为这样可以保证ans第i位为1,且后面不可能有机会改变第i位。
很显然,数组中最小的非零数就是最小值。
查询第k大值
转自Marser
首先将数组中的所有数变成包含这个最高位且可以通过Xor得到的最小值。
具体实现方法就是每一位向后扫,若Xor后变小,则Xor。
之后就可以发现第k大只要将k改为二进制后,将二进制所对应的位置的数Xor起来即可。