洛谷 P3812【模板】线性基
给 个整数,可能存在重复,任意选取几个,使得他们的异或和最大。
什么是线性基?
给一组数 ,他们的线性基为 。
求线性基:
void insert(ll x){
for(int i=55;i>=0;i--){
if((x>>i)==0)continue;
if(!p[i]) { // 第 i 位不为 0
p[i]=x;
break;
}
x^=p[i]; // 可以理解为将 x 这个向量去掉和 p[i] 这个基向量相关的成分
}
}
整体的理解和线性代数里的基向量很像。
#include<iostream>
#include<cstdio>
#define MAXN 65
using namespace std;
typedef long long ll;
int n;
ll a[MAXN],p[MAXN],res;
void insert(ll x){
for(int i=55;i>=0;i--){
if((x>>i)==0)continue;
if(!p[i]){
p[i]=x;
break;
}
x^=p[i];
}
}
int main(){
#ifdef WINE
freopen("data.in","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
insert(a[i]);
}
for(int i=55;i>=0;i--)
if(res<(res^p[i]))
res^=p[i];
printf("%lld\n",res);
return 0;
}