N個數選任意個使得異或和最大(高斯消元)
阿新 • • 發佈:2019-02-20
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; const LL INF = 1E9+9; const int maxn = 1e5+6; /*求在XOR數組裡面選任意多的元素的異或和最大*/ LL XOR[maxn]; LL base[65]; LL guass(int n) { /* 假設: n==5 LL XOR[5]={15,10,9,7,3}; 15: 1 1 1 1 10: 1 0 1 0 9: 1 0 0 1 7: 0 1 1 1 3: 0 0 1 1 */ memset(base,0,sizeof(base)); for(int i=0;i<n;i++) { LL cur=XOR[i]; for(int j=59;j>=0;j--) { if((1ll<<j)&cur) { if(base[j]==0) { base[j]=cur; break; } else { cur^=base[j]; } } } } /* 轉化成上三角矩陣 : 1 1 1 1 0 1 0 1 0 0 1 1 0 0 0 1 */ LL ret=0; for(int i=0;i<60;i++) for(int j=i+1;j<60;j++) if((base[j]>>i)&1) base[j]^=base[i]; /* 進一步消元得: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 */ for(int i=59;i>=0;i--) ret^=base[i]; return ret; } int main() { int n; while(cin>>n) { for(int i=0;i<n;i++) cin>>XOR[i]; guass(n); } return 0; }