zoukankan      html  css  js  c++  java
  • BZOJ_4269_再见Xor_线性基

    BZOJ_4269_再见Xor_线性基

    Description

    给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值。

    Input

    第一行一个正整数N。
    接下来一行N个非负整数。

    Output

    一行,包含两个数,最大值和次大值。

    Sample Input

    3
    3 5 6

    Sample Output

    6 5

    HINT

    100% : N <= 100000, 保证N个数不全是0,而且在int范围内

    高斯消元后的线性基有如下性质:
      每个向量的最高位对应的列只有这1个1。
    因此所有线性基异或起来一定是最大的,并且异或上最后一个一定是次大的。
    同理我们可以求出第k大的。
     
    代码:
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    #include <bitset>
    using namespace std;
    int n,a[100050],b[100],cnt,tot;
    void Gauss() {
        int i,j;
        for(i=(1<<30);i;i>>=1) {
            tot++;
            int mx=tot;
            while(mx<=n&&!(a[mx]&i)) mx++;
            if(mx==n+1) {
                tot--; continue;
            }
            b[++cnt]=i;
            swap(a[tot],a[mx]);
            for(j=1;j<=n;j++) {
                if(tot!=j&&(a[j]&i)) a[j]^=a[tot];
            }
        }
    }
    int main() {
        scanf("%d",&n);
        int i;
        for(i=1;i<=n;i++) scanf("%d",&a[i]);
        Gauss();
        int ans=0;
        for(i=1;i<=tot;i++) ans^=a[i];
        printf("%d %d
    ",ans,ans^a[tot]);
    }
    
  • 相关阅读:
    前端学习:html基础学习四
    前端学习:html基础学习三
    cogs 2691. Sumdiv
    cogs 421. HH的项链
    Bzoj 2038: [2009国家集训队]小Z的袜子(hose)
    【NOIP模拟赛】密码锁
    cogs1612. 大话西游
    cogs1583. [POJ3237]树的维护
    Bzoj 3343: 教主的魔法
    SPOJ375 Query on a tree
  • 原文地址:https://www.cnblogs.com/suika/p/8967304.html
Copyright © 2011-2022 走看看