线性基

背个板子即可。以下是前缀线性基。

struct xor_set {
	int a[32];	
	inline void add (long long val) {
		for (int i = 31; i >= 0; i --) {
			if (! (val & (1ll << i))) continue ;
			if (a[i]) val ^= a[i];
			else { a[i] = val; break ; }
		}
	}
	inline int query (int x) {
		int res = x;
		for (int i = 31; i >= 0; i --)
			if((res ^ a[i]) > res) res ^= a[i];
		return res;
	}
	inline void merge (xor_set v) {
		for (int i = 31; i >= 0; i --) add(v.a[i]);
	}
}

支持的是插入,查询异或最大值,合并,以及每一位异或值是否可以表示出来。

给出一点杂题。

CF1100F Ivan and Burgers

前缀线性基,维护所有位上编号最大的元素即可。

Duff as a Queen 同 [Ynoi2013] 无力回天 NOI2017

总所周知,线性基支持单点修改,老哥合并。所以考虑树状数组和线段树即可,区间修改转差分。
准确来说是考虑对于 \(a_i\) 异或差分,然后每次我们修改相当于一个单点的修改,然后每次挑 \([l + 1, r]\) 里面的数来跑线性基。其实是在证明差分数组和一个数的线性基等价于一整段数。

[WC2011] 最大XOR和路径

找到一个 \(1 \to n\) 的路径使得其异或和最大(可以重复经过点边)。

考虑之前 ARC 那个 F,然后走很多次是不算的,所以有如下结论。
一定是 \(1 \to n\) 一条路径选上一堆环。环丢进线性基即可。

posted @ 2023-08-09 10:31  Cust10  阅读(27)  评论(0)    收藏  举报