线性基小记

线性基(这里是异或线性基)是对于序列 \(a_1 ... a_n\) 满足以下条件的一个极小集合 \(\mathrm S\)

  • \(S\) 中的所有元素可以通过异或表示出 \(a\) 中的所有元素。

  • \(S\) 在满足第一个条件的情况下,集合大小最小。

进一步的,可以推出以下性质:

  • \(S\) 中任意元素的异或和不等于 \(0\)

  • \(S\) 的大小至多为 \(\log \max{a_i}\)

第二个性质将在插入时自然给出。

基本操作:

  • 插入:假设现在要插入的数是 \(x\)。考虑记 \(bs_i\) 是以第 \(i\) 位为最高 \(1\) 位的基底。不难发现,假如当 \(x\) 遍历到第 \(i\) 位时,且 \(x\) 的第 \(i\) 位为 \(1\),该位的 \(bs_i\) 为空,则 \(x\) 无法被表出,原因是再向下遍历则无法在更改这一位。否则 \(x\) 必须要异或上该位。若最后 \(x\) 变为 \(0\),其实就是 \(x\) 已经可以被表出,跳过即可。
qwq
void ins(int x){
	for(int i = M; i >= 0; i--){
		if(!(x & (1ll << i))) continue;
		if(!bs[i]){bs[i] = x; return;}
		x ^= bs[i];
	}
}
  • 查询最大值:假设现在要查询 \(a\) 中选出任意个数与 \(x\) 的异或最大值,从高位向低位考虑,显然后面选择的不会影响前面的,直接贪心即可。
qwq
int getmax(int x){
	int ret = x;
	for(int i = M; i >= 0; i--) ret = max(ret, ret ^ bs[i]);
	return ret;
}
  • 查询第 \(k\) 小的值:考虑类似于 \(\mathrm {Trie}\) 上二分的做法,首先将所有的 \(bs\) 变成任意两个都无交的形式,从高位向低位考虑,容易发现,假设这一位选择 \(1\),则排名区间就变成了 \([1, 2 ^ {i - 1}]\),否则是 \([2^{i - 1} + 1, 2^i]\)。然后二分就完了。
qwq
	void rebuild(){
		for(int i = 0; i <= M; i++){
			for(int j = i - 1; j >= 0; j--){
				if(bs[i] & (1ll << j)) bs[i] ^= bs[j];
			}
		} tot = 0;
		for(int i = 0; i <= M; i++) if(bs[i]) rbs[++tot] = i;
	}
	int kth(int x, int k){
		int ret = x;
		for(int i = tot; i >= 1; i--){
			int sz = (1ll << i - 1);
			if(k <= sz){
				if((x & (1ll << rbs[i]))) ret ^= bs[rbs[i]];
			}
			else{
				if(!(x & (1ll << rbs[i]))) ret ^= bs[rbs[i]];
				k -= sz;
			}
		} return ret;
	}

随机说话:

  • 线性基具有可合并性,是 \(O(\log^2 V)\) 的,还算可以,大概可以用线段树之类的维护?(所以是不是可以出一个线性基+猫树分治qwq)

  • 如果一个数无法插入到线性基中,说明有一个子集的异或和为 \(0\) (显然的qwq)

  • 最大异或路径就是随便跑一个生成树,然后再走若干个环就行了。因为你不难发现,假如要使路径中包含一个环,可以走过去绕一圈原路返回,中间的都被消掉了,这样只需要加入环的贡献,于是可以直接加入进路径异或和中。如果不是原路返回,也就是说这里有两条路径从环到原路径,于是等价于再加入一个环的贡献。假如你是要走另外一条链,那么一定会和原来的路径构成一个环,于是也包含在其中了。

这里运用到一个经典的转化:两个点有两条路径相互到达 \(\leftrightarrow\) 两个节点中可达的部分一定有一个环

  • 假如一个线性基里面有 \(n\) 个元素,可以表出的不同数的个数为 \(2^n\)。进一步的,假如线性基中有包含第 \(i\) 位的元素,会有 \(2^{n-1}\) 个可以表出的数在该位上为 \(1\),剩下 \(2^{n - 1}\) 个在该位上为 \(0\)。这一点是由于可以把线性基中的元素变为两两不交的形式,然后强制选出/不选含有该位的那个元素,剩下随便选。

  • 二进制题目的基本套路:高位贪心,按位统计

练习题

P4570 [BJWC2011]元素

P3292 [SCOI2016]幸运数字

P4151 [WC2011]最大XOR和路径

P5556 圣剑护符

CF724G Xor-matic Number of the Graph

CQOI2013 新Nim游戏

CF938G Shortest Path Queries

posted @ 2024-11-19 11:27  Little_corn  阅读(11)  评论(0)    收藏  举报