跳到主要内容

线性基

参考资料

例题

洛谷 P3812 【模板】线性基

给定 nn 个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

代码(1)
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
const int N=63;
ll p[N];
void insert(ll x)
{
for(int i=N;i>=0;i--)
{
if(x>>i==1)
{
if(p[i]==0)
{
p[i]=x;
return;
}
else x^=p[i];
}
}
}
ll query()
{
ll res=0;
for(int i=N;i>=0;i--)res=max(res,res^p[i]);
return res;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
ll t;
cin>>t;
insert(t);
}
cout<<query()<<'\n';
return 0;
}