洛谷3812:【模板】线性基——题解

https://www.luogu.org/problemnew/show/P3812#sub

给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大。

我知道代码很简单,可是我一直在找一个理解性题解。

(我笨啊……)

这个人说的十分的好,下面引用他的话:https://mcfx0.blog.luogu.org/solution-p3812 (侵删)

首先考虑下面这个情况:

如果这n个数每个数的最高位的1的位置都不一样,我们就可以从高位向低位贪心选择取或者不取。

线性基就是把n个数选一些异或和出来化成这样一种情况:

对于当前这个数,选取它的最高位的1,看看线性基中有没有已经存入一个这样的数,如果没有存入,当然就把这个数存入,退出。

但是如果已经有了呢?可以发现线性基中存了的数一定是之前一些数的异或和,并且它的最高位的1也是同一位。那么我们把当前这个数异或上线性基存的这个数(显然结果还是一些数的异或和),自然这个最高位的1的位置就会变低,然后再丢回上一步重新考虑。

最后在这个线性基上做贪心就行了。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[51];
void insert(ll k){
    for(int i=50;i>=0;i--){
    if(k&(1LL<<i)){
        if(!a[i])a[i]=k;
        k^=a[i];
    }
    }
}
int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++){
    ll k;scanf("%lld",&k);
    insert(k);
    }
    ll ans=0;
    for(int i=50;i>=0;i--){
    if(ans<(ans^a[i]))ans^=a[i];
    }
    printf("%lld\n",ans);
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8808084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
苹果公司所用字体大全苹果公司所用字体大全苹果公司所用字体大全苹果公司所用字体大全苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大全,苹果公司所用字体大

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值