OI中的线性基

版权声明:未经作者本人允许禁止转载。 https://blog.csdn.net/jokerwyt/article/details/81636007

水平有限,此处只记录一些OI中线性基的思路,基本与线性代数无关了。

定义

线性基一般用于求解异或问题。
对n个数求其线性基,得到最多 二进制下位数m 个数。其满足三个性质:
1. 线性基能相互异或得到原集合的所有相互异或得到的值。
2. 线性基是满足性质1的最小的集合
3. 线性基没有异或和为0的子集。(因此要特判0的情况)

注意一点,线性基内不一定是原数。 但我们称被成功插入线性基的数为在线性基中。
线性基有多个(据说有维数个,也就是位数个)。

构造方法

增量法,考虑插入一个数。
由于集合内元素可以互相异或,而选出一个子集异或的结果集是不会变的。
所以有下面的构造方法:
从高到低看插入数X的第i位,若第i位不为0,则看b[i]是否为0(可以插入),若否则令x^=b[i],继续过程。
若是,则b[i]=x,并先用低位b[i]消去他的低位1,再用它消去高位的第i位1。(这个过程叫回消,可以没有,但这样之后贪心方便)
返回0代表出现异或和为0的子集了。

这里写图片描述

回消所带来的方便在于,若b[i]不为空,则只有b[i]第i位是1。
插入一次的时间是 O ( log n )

应用

@hzj
这里写图片描述
还有一个就是,图有边权,求图中某种a-b走法的边权异或时,有这样的套路:
1.找出所有环,插入线性基。
2.任意找一条路径,和(线性基内任意异或和)再进行异或就是图中的某种走法。

猜你喜欢

转载自blog.csdn.net/jokerwyt/article/details/81636007
今日推荐