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 小

posted @ 2023-11-13 18:47  Hypoxia571  阅读(8)  评论(0编辑  收藏  举报