题意:从n个数中,选择一些数,使得异或最大。
将这些数转化为2进制。
构造等式Ax=B,A是每个数字取或者不取,B不妨都设为1。
为了使得异或最大,那么最高位尽可能为1。
因此,从最高位开始尽可能使得等式成立,即当前处理第i个等式,则0~i-1个等式对第i个等式消元。若当前等式有解,ans|=1<<(60-i)。
1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 110 4 typedef long long LL; 5 int n, g[MAXN][MAXN]; 6 void Gauss() { 7 LL ans = 0; 8 int i, j, r; 9 for (r = 0; r < 61; r++) { 10 g[r][n] = 1; 11 for (i = 0; i < r; i++) { 12 for (j = 0; j < n; j++) { 13 if (g[i][j]) 14 break; 15 } 16 if (j < n && g[r][j]) { 17 for (; j <= n; j++) 18 g[r][j] ^= g[i][j]; 19 } 20 } 21 for (i = 0; i < n; i++) { 22 if (g[r][i]) 23 break; 24 } 25 if (i < n || (i == n && !g[r][n])) 26 ans |= 1LL << (60 - r); 27 } 28 printf("%I64d\n", ans); 29 } 30 int main() { 31 int i, j; 32 LL tmp; 33 while (~scanf("%d", &n)) { 34 memset(g, 0, sizeof(g)); 35 for (i = 0; i < n; i++) { 36 scanf("%I64d", &tmp); 37 for (j = 60; j >= 0; j--) 38 g[60 - j][i] = (tmp >> j) & 1; 39 } 40 Gauss(); 41 } 42 return 0; 43 }