Nim的一个结论就是元素异或和为0时,先手必败,否则先手必胜
所以当前先手的策略就是使得后手无论怎么拿,都不可能使元素异或和=0。也就是,我们要取尽可能少的数,使得局面成为一个线性基。因为总能构造出一个线性基(多了就拿掉呗),所以先手必胜;
因为要使得结果最小,因此排序,先插入较大的数
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
const ll N=1e5+10;
ll n,m;
ll mas[N];
ll d[70];
ll sum=0;
void add(ll x)
{
ll pre=x;
for(int i=60;i>=0;--i)
{
if(x&(1ll<<i))
{
if(d[i]) x^=d[i];
else
{
d[i]=x;
break;
}
}
}
if(x==0) sum+=pre;
}
void solve()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>mas[i];
sort(mas+1,mas+1+n,greater<ll>());
for(int i=1;i<=n;++i) add(mas[i]);
cout<<sum<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
solve();
return 0;
}