线性基
是向量空间的一组基,即是有一个集合构造出来的另一个集合,用来解决有关异或题目
满足以下性质
- 线性基内元素相互异或可以得到原序列相互异或得到的值
- 线性基没有异或为0的子集
- 线性基每个元素的异或方案唯一
- 线性基的每个元素的最高位互不相同
构造方法
把每个数x转为二进制,从高到低,若该位为1,如果线性基该位为空,那么赋值并结束循环;否则将该数x更改为x^=p[i],继续循环。
int p[maxn];
void insert(ll x) {
for (int i = 63; i >= 0; --i) {
if (!(x >> i))
continue;
if (!p[i]) {
p[i] = x;
break;
}
x ^= p[i];
}
}
解决问题
- 求原集合内任意元素异或给定值的最大值
从高位到低位,若该位的数异或上答案能使答案变大则异或上该值
因为线性基的每位最多一个为1,所以从高到低可以保证低位不对高位的异或结果产生影响
- 求原集合任意元素异或后的最小值
答案就是线性基中的最小值
- 求某个数能否被原集合异或出来
即插入操作,判断最后的x是否被异或为0