思路:
按照从大到小排个序 维护两个数组 一个是消元后的 另一个是 按照消元的位置排的 不断 维护从大到小 (呃具体见代码)//By SiriusRen#include#include #include using namespace std;#define int long long#define N 105int n,a[N],b[N],flag=1,ans;signed main(){ scanf("%lld",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]),ans+=a[i],b[i]=a[i]; sort(a+1,a+1+n,greater ()),sort(b+1,b+1+n,greater ()); for(int i=1<<30,j;i;i>>=1){ for(j=flag;j<=n;j++)if(a[j]&i)break; if(j==n+1)continue; for(int k=j-1;k>=flag;k--)swap(a[k+1],a[k]),swap(b[k+1],b[k]); for(int k=1;k<=n;k++)if(k!=flag&&(a[k]&i))a[k]^=a[flag]; ans-=b[flag]; flag++; } printf("%lld\n",ans?ans:-1);}