题目描述:
给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
题目分析:
线性基模板可解决
将N个整数看做集合A
线性基即为集合A的子集
线性基中每个元素的异或方案唯一,也就是说,线性基中不同的异或组合异或出的数都是不一样的。
线性基的二进制最高位互不相同。
这样我们先构造出线性基
然后贪心的去搞最大值就行了
题目链接:
Ac 代码:
#include <iostream>
#include <cstdio>
#define ll long long
ll p[62];
void insert(ll x)
{
for(ll i=60;i>=0;i--)
if(x>>i&1)
{
if(!p[i])
{
p[i]=x;
return;
}
x^=p[i];
}
}
ll askmax()
{
ll res=0;
for(int i=60;i>=0;i--)
res=std::max(res,res^p[i]);
return res;
}
int main()
{
int n;
ll x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&x),insert(x);
printf("%lld\n",askmax());
return 0;
}