zoukankan      html  css  js  c++  java
  • 最大异或和——线性基模板

    问题

    链接

    给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。($1 leq n leq 50, 0leq a_i leq 2^{50}$)

    分析

    异或和本来没有单调性,但是从高到低遍历线性基是单调的。考虑第 $i$ 位时,如果当前答案 $x$ 第 $i$ 位为0,就将 $x$ 异或上 $a_i$;否则不做任何操作。显然每次答案不会变劣,最终的 $x$ 即为答案

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    int n;
    ll num[55], base[55];
    
    void getBase()
    {
        for(int i = 0;i < n;i++)
        {
            for(int j = 52;j >= 0;j--)
            {
                if(num[i] & (1ll << j))  //找到num[i]的最高位1
                {
                    if(!base[j])
                    {
                        base[j] = num[i];
                        break;
                    }
                    else  num[i] ^= base[j];
                }
            }
        }
    }
    
    int main()
    {
        scanf("%d", &n);
        for(int i = 0;i < n;i++)  scanf("%lld", &num[i]);
        getBase();
        ll ans = 0;
        for(int i = 52;i >= 0;i--)
        {
            if((ans ^ base[i]) > ans)  ans ^= base[i];
        }
        printf("%lld
    ", ans);
    
        return 0;
    }
  • 相关阅读:
    Dangling Javadoc comment
    IntelliJ IDEA :Error(1, 1) java 非法字符 'ufeff'
    什么是webhook
    智能DNS
    filebeat 乱码
    windows,交换机syslog收集
    Rsyslog
    ntp
    centos7 -lvm卷组
    nginx安装
  • 原文地址:https://www.cnblogs.com/lfri/p/11270018.html
Copyright © 2011-2022 走看看