线性基 & 洛谷 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;
}