题意:从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 }
posted on 2012-09-03 14:33  DrunBee  阅读(448)  评论(0编辑  收藏  举报