线性基 & 洛谷 P3812 【模板】线性基

线性基

推荐Menci博客的前半部分:https://oi.men.ci/linear-basis-notes/

非常学术的讲解了线性基。

然后对于如何构造线性基,我一般使用以下方法:

对于每一个加进来的数,从高位向低位扫,若某一位是1,则看线性基的a[i]是否有值,若有,则这个数^=a[i],否则a[i]=这个数,插入完毕。

功能

  • 查询最大异或和:从高位开始枚举,若异或上a[i]的ans更大,则异或上。
  • 查询最小异或和:线性基里的最小的数
  • 查询异或值的数量:2的线性基长度次幂(线性基长度即为线性基内元素个数)

AC代码

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
long long ans,a[55],n;
void work(long long x){
	for(int i=50;i>=0;i--){
		if((1ll<<i)&x){
			if(a[i]) x^=a[i];
			else{
				a[i]=x;
				return;
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		long long x;
		cin>>x;
		work(x);
	}
	for(int i=50;i>=0;i--){
		if((ans^a[i])>ans) ans=ans^a[i];
	}
	cout<<ans;
	return 0;
}
posted @ 2021-10-26 22:58  尹昱钦  阅读(52)  评论(0编辑  收藏  举报