线性基

性质

  1. 线性基集合的任意不同子集的异或和不同。
  2. 原集合的子集的的异或和均可以用其线性基表示。

构造过程

贪心:每插入一个数 \(x\)

  1. 从考虑 \(x\) 的二进制最高位,若在线性基无该位,则将 \(x\) 插入线性基,否则让 \(x\) 异或上线性基上那一位的数。
  2. 重复上一步,直到 \(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;
			}
		}
	}
}

用途

广泛用于异或的问题

  1. 求一个集合中子集的异或和的第 \(k\) 大的值。(如最大值 Luogu3812)
  2. 求一个集合中子集的异或和为 \(s\) 的个数。(如是否 \(s\) 能被表示)
posted @ 2024-07-08 15:44  louisliang  阅读(1)  评论(0编辑  收藏  举报