码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 浅谈线性基


    线性基可以用来解决一些有关子集异或和的问题。

    定义

    对于一个数组,他的线性基(是一个数组)满足以下条件。

    • 对于原数组所有子集(不能为空)的异或和,都可以用线性基的一个子集(不能为空)表示出来。
    • 所包含的元素最小。

    我们知道了线性基的定义,我们来看看如何求出来线性基。

    性质

    线性基有一个性质,就是线性基里的数可以互相异或,异或后还是原数组的线性基。

    假设我们将 p i p_i pi​ 异或上 p j p_j pj​ ,如果以后要用到原本的 p i p_i pi​ ,我们就异或上 p i ⊕ p j p_i\oplus p_j pi​⊕pj​ 。如果我们需要用上 p i ⊕ p j p_i\oplus p_j pi​⊕pj​ ,那就异或上 p i p_i pi​ ,这就不会影响到线性基所能表示的异或和。

    求法

    我们把原数组从头到尾遍历,如果一个数他不能被当前的线性基表示出来,我们就将他加到线性基里。

    我们来看看如何加到线性基里。

    我们设 p i p_i pi​ 表示在二进制下最高的为 1 1 1 的位是第 i i i 位的一个数。

    如果我们当前枚举的数的最高位是 j j j ,如果 p j p_j pj​ 有值,说明我这一位可以被异或出来,那我就将这个数异或上这个值,然后继续找当前数的最高位。

    如果 p j p_j pj​ 没有值,则说明这个数的第 j j j 位不能被异或出来,我们就将 p j p_j pj​ 设为当前的值。

    为什么不设为 2 j 2^j 2j 呢?

    因为我们可以看成在当前来说,二进制下这几个 1 1 1 一起出现会使得线性基尽量小。

    upd : 当时估计想错了,其实是因为你需要保证元素最少,同时所有都要能被表示,如果设为 2 j 2^j 2j,那就需要更多的位数来表示这个数。

    如果后面需要把二进制下这几个 1 1 1 分开,我们就把分开的 1 1 1 再用一个值表示就好了。(由于线性基的性质,我们可以看作分成的两个值中一个异或上了另一个)

    这样子,我们的线性基就能被求出来了。

    for (int i = 1; i <= n; i++)// 遍历每个数
    		for (int j = 63; j >= 0; j--)// j的起点为你可能出现的最高位
    			if (a[i] >> j) {// 如果当前位为1
    				if (p[j] == 0) { 
    					p[j] = a[i];
    					break; 
    				}
    				else
    					a[i] = a[i] ^ p[j];
    			}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    【Mac】Lightroom Classic 2024(LrC 2024中文版) v13.1安装教程
    使用AIOps进行更好的事件管理
    【已解决】“const char*“类型的实参与“LPCWSTR-类型的形参不兼容
    【Jmeter】提取和引用Token
    2023年5月CSDN客服月报|解决5个重大问题和18个次要问题,采纳1个用户建议,处理2个用户需求
    小白健身心路历程
    CSF视频文件格式转换WMV格式
    Redis:抢单预热
    代码随想录7——哈希表:454四数相加II、383赎金信、15三数之和、18四数之和
    论文浅尝 | GPT-RE:基于大语言模型针对关系抽取的上下文学习
  • 原文地址:https://blog.csdn.net/weixin_46700592/article/details/128206341
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号