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]);
    }
    
  • 相关阅读:
    C#中发送邮件,包含Html代码 CDO.Message
    CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板
    分享到微信朋友圈
    获取验证码效果和后台代码(js+html+cs)
    弹出遮罩层
    WebAPI上传文件
    zoj1665 dij变形
    hdu1535 SPFA
    hdu1217 floyd
    poj1703 并查集
  • 原文地址:https://www.cnblogs.com/suika/p/8967304.html
Copyright © 2011-2022 走看看