题目背景
这是一道模板题。
题目描述
给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
输入输出格式
输入格式:
第一行一个数n,表示元素个数
接下来一行n个数
输出格式:
仅一行,表示答案。
输入输出样例
输入样例#1:
2 1 1
输出样例#1:
1
说明
1<=n<=50 0<=Si<=2^50
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define LL long long
LL a[61];
/*a[i]表示当前线性基内任意异或出来的数字中,最高位为i的任意一个数字。
如果x的第i位有值:如果a[i]不存在,则a[i]=x,并退出。如果a[i]存在,令x^=a[i]*/
bool insert(LL x)
{
for(int i=60;i>=0;i--)
{
if(x&(1LL<<i))
{
if(a[i]==0)
{
a[i]=x;
break;
}
x^=a[i];
}
}
return x>0;
}
LL get_max()
{
LL ans=0;
for(int i=60;i>=0;i--)
{
if((ans^a[i])>ans)
ans=ans^a[i];
}
return ans;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
LL x;
cin>>x;
insert(x);
}
cout<<get_max()<<endl;
return 0;
}