【模板】线性基(洛谷P3812)
Description
给定\(n\)个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。
Input
第一行一个数\(n\),表示元素个数
接下来一行\(n\)个数
Output
仅一行,表示答案。
Solution
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
long long x,p[60];
void insert(long long x)
{
for (int i=50;i>=0;i--)
{
if ((x>>i)&1)
{
if (!p[i])
{
p[i]=x;
break;
}
else x^=p[i];
}
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&x);
insert(x);
}
long long ans=0;
for (int i=50;i>=0;i--)
if ((ans^p[i])>ans) ans^=p[i];
printf("%lld\n",ans);
return 0;
}