P3812 【模板】线性基
时间限制 1.00s
内存限制 250.00MB
题目背景
这是一道模板题。
题目描述
给定\(n\)个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
输入格式
第一行一个数\(n\),表示元素个数
接下来一行\(n\)个数
输出格式
仅一行,表示答案。
输入输出样例
输入 #1
2
1 1
输出 #1
1
说明/提示
\(1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50}\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
const int N=50+5;
ll a[N];
void Insert(ll x){
for(int i=62;~i;--i)
if(x&(1ll<<i)){
if(!a[i]){ a[i]=x; return ; }
x^=a[i];
}
}
ll Query(){
ll res=0;
for(int i=62;~i;--i)
res=max(res,res^a[i]);
return res;
}
int main(){
int n;
scanf("%d",&n);
while(n--){
ll x; scanf("%lld",&x);
Insert(x);
}
printf("%lld",Query());
return 0;
}