xor 线性基
void add(int x) {
dn(i,60,0) if(x>>i&1) {
if(mg[i]) x=x^mg[i];
else { mg[i]=x; break; }
}
}
线性基的第 \(i\) 位如果有数,那它最高位是 \(2^i\)。
首先这样搞出来的是一个线性基,它有这些性质(
-
线性基能相互异或得到原集合的所有相互异或得到的值。
-
线性基是满足上条性质的最小的集合。
-
线性基没有异或和为 0 的子集。
查询 xor 的存在性 qaq
bool find(int x) {
dn(i,60,0) if(x>>i&1) x=x^d[i];
return !x;
}
查询 xor 最大值 qaq
最小值的事情就是最小的那个 qwq
int ask() {
int res=0;
dn(i,60,0) if((res^mg[i])>>i&1)
res=res^mg[i];
return res;
}
第 k 小