zoukankan      html  css  js  c++  java
  • 【SGU】275 To xor or not to xor

    题意:从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 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    go context
    go etcd
    go logs
    go config
    go tail
    kafka与zookeeper
    go kafka
    go mysql
    array_map array_walk
    单独配置的nginx mysql 重启
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2668770.html
Copyright © 2011-2022 走看看