线性基
性质
- 线性基集合的任意不同子集的异或和不同。
- 原集合的子集的的异或和均可以用其线性基表示。
构造过程
贪心:每插入一个数 \(x\):
- 从考虑 \(x\) 的二进制最高位,若在线性基无该位,则将 \(x\) 插入线性基,否则让 \(x\) 异或上线性基上那一位的数。
- 重复上一步,直到 \(x\) 变为 \(0\)。
代码实现
void ins(long long x){
for(int j = 50; ~j; j--){
if((x >> i) & 1){
if(k[j])
x ^= k[j];
else{
k[j] = x;
break;
}
}
}
}
用途
广泛用于异或的问题
- 求一个集合中子集的异或和的第 \(k\) 大的值。(如最大值 Luogu3812)
- 求一个集合中子集的异或和为 \(s\) 的个数。(如是否 \(s\) 能被表示)