背个板子即可。以下是前缀线性基。
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
总所周知,线性基支持单点修改,老哥合并。所以考虑树状数组套线段树即可,区间修改转差分。
[WC2011] 最大XOR和路径
找到一个 \(1 \to n\) 的路径使得其异或和最大(可以重复经过点边)。
标签:int,res,--,异或,即可,线性 From: https://www.cnblogs.com/Custlo/p/17616228.html考虑之前 ARC 那个 F,然后走很多次是不算的,所以有如下结论。
一定是 \(1 \to n\) 一条路径选上一堆环。环丢进线性基即可。