传送门
题解:
首先塞到线性基上面。
显然线性基外面的数全部可以变成最大异或和。
线性基里面的,先高斯消元,然后将最大的基变成最大异或和。
剩下的基显然最好的结果就是直接和最大异或和xor起来。
直接贪心即可。
代码:
#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs const
ll b[70],c[70],mx;int cnt;
inline void ins(ll a){
for(int re i=55;~i;--i)if(a>>i&1){
if(b[i])a^=b[i];
else {
b[i]=a;
break;
}
}
}
int n;
ll ans;
signed main(){
scanf("%d",&n);
for(int re i=1;i<=n;++i){
ll a;scanf("%lld",&a);
ins(a);
}
for(int re i=55;~i;--i)
for(int re j=i-1;~j;--j)if(b[i]>>j&1)b[i]^=b[j];
for(int re i=55;~i;--i)if(b[i])c[++cnt]=b[i];
for(int re i=cnt;i;--i)mx^=c[i];
ans=(n-cnt+1)*mx;
for(int re i=2;i<=cnt;++i)ans+=mx^c[i];
printf("%lld",ans);
return 0;
}