【知识点】线性基
定义
在 $ n $ 维的布尔集空间上,找到一组 $ n $ 维的基,其进行任意的异或操作可以拼出该布尔集空间的所有二进制数。
算法
算法的主要思想是高斯消元法,从高位开始,如果此位为 $ 1 $ 则尝试计入基,如果该位置已经有数字,则矩阵行变换消除首个 $ 1 $ ,这里的行变换采取的是异或的方式。所以,高斯消元法最终得到的基是一个 $ n * n $ 的行简化阶梯矩阵。
bool insert(i64 x) {
for (int i = 18; i >= 0; i--)
if ((x >> i) & 1){
if (!p[i]){
p[i] = x;
return 1;
}
x ^= p[i];
}
return 0;
}
在主函数内,要从一些数中选出线性基,直接逐个 $ insert $ 即可。注意,保留的数字已经被异或过了,所以不一定是当前调用 $ insert $ 时传入的 $ x $, 如果需要保留原数字不做改动,需要另作一个数组来存储真正的基,而用 $ p $ 数组来判断能不能插入。

浙公网安备 33010602011771号