首页 > 其他分享 >[学习笔记] 线性基

[学习笔记] 线性基

时间:2023-10-04 23:23:00浏览次数:39  
标签:基中 二进制 笔记 学习 插入 异或 线性 最高

线性基是向量空间的一组基,通常可以解决有关异或的一些题目。 ——OI Wiki

线性基就是从初始集合中选出的一个子集,它满足一些性质,可以处理一些问题(屁话)。

性质

  1. 线性基中每个元素二进制下最高位是不同的。
  2. 线性基中没有异或和为 \(0\) 的子集。
  3. 线性基中任意子集中元素异或和的值域等于原集合的值域,且集合大小最小

构造

考虑这样一个问题:

求一个集合任意元素异或和的最大值。

首先我们回想一下异或的性质:如果二进制某一位相同的两个数,那么这一位就为 \(1\),反之为 \(0\)。特别地,异或这一运算满足交换律。

思考什么时候异或和最大?我们希望的肯定是最终值二进制下 \(1\) 的个数越多越好,换言之,最高位的 \(1\) 越靠前越好。

因为异或是按位操作,所以当靠前的一位确定下来后,后面的几位不管怎么搞都不会对前面的这一位产生影响。

所以得到一个类似贪心(?)的算法:

假设我们要往线性基中插入一个数 \(x\),其最高位为 \(d\)。

  • 若 \(d\) 位未被插入过值,则往 \(d\) 位插入 \(x\)。
  • 反之,将 \(x\) 异或上当前第 \(d\) 位上的 \(y\),往下一位进行扫描,直到变成 \(0\) 或者被插入。

为什么 \(x\) 要异或上 \(y\) 呢?

因为任何一个数二进制的最高位都是 \(1\)。在同一个位置遇到了已经插入过的数证明两个数最高位相同,此时异或一下,使要插入的值最高位变成 \(0\),再去判断新的最高位找一个新的位置插入。是为了尽可能使二进制的每一位都可以有 \(1\),且可以证明对答案无影响。

代码:

void insert(int x){
	for (int i = len;i >= 0;i--){			// len 为二进制数最大长度,因题目而异 
		if (!(x & (1ll << i))) continue;	// 判断 x 的当前位是否为 1
		if (!p[i]) { p[i] = x; return ; }	// 插入成功
		x ^= p[i];							// 插入失败就异或,枚举下一位 
	}
}

参考资料

标签:基中,二进制,笔记,学习,插入,异或,线性,最高
From: https://www.cnblogs.com/y1wei/p/17742912.html

相关文章

  • [学习笔记] 树链剖分
    叫复习笔记或许更好。树链剖分就是把树剖成链去解决一些问题。定义重子节点:子节点中子树大小最大的节点。轻子节点:除重子节点外的其他子节点。重边:到重子节点的边。轻边:到轻子节点的边。记号\(dfn[x]\):DFS序,也是在线段树中的编号。\(son[x]\):重子节点。\(dep[x]\)......
  • [学习笔记] Tarjan 连通性全家桶
    拜谢陈老师的PPT!!!无向图割点若点\(x\)不为搜索树的根节点,则\(x\)是割点当且仅当搜索树上存在一个\(x\)的子节点\(y\)满足:\(dfn_x\lelow_y\)。特别地,当\(x\)是搜索树的根节点时,则\(x\)是割点当且仅当有两个点\(y_1,y_2\)满足上述条件。割边边\((x,y)\)是......
  • 笔记——线段树
    蓝月の笔记——线段树篇在树状数组中,我们讲解了关于单点修改区间查询的操作。今天,我们要讲一种更加高级的数据结构,他解决的是区间修改区间查询的问题多了一个区间当然更高级啦。这个数据结构就是——线段树Luogu-P3372给定一个长度为\(n\)的序列\(a_1,a_2,\cdots,a_n\)......
  • MapReduce分区的学习
    1、概念和原理同一个分区的数据会发送给同一个reduce;可以简单解释为————标记一样,放到一个reduce里面:2、代码编写步骤(以中奖编号是否>15进行分区)1、定义Mapper可以自定义名称为PartitionMapper,并继承Mapper类:并重写map方法:2、自定义partitioner可以自定义名称为MyPa......
  • c# winfom从0学习开发开发OA、BPM工作流程与自定义表单系统(一)设计前准备
    使用DevComponents.DotNetBar2.dllmessagebox样式不能满足当前的要求,所以就把消息框使用了窗体自定义样式展示 窗体的具体代码publicpartialclassFormMessageBox:Office2007Form{publicDialogResultUserChoice{get;privateset;}public......
  • Linux运维学习笔记
    此笔记为学习https://www.bilibili.com/video/BV1nW411L7xm/?vd_source=3f851e85e66ef33269a2eefee664cec2的学习记录,目前持续更新中,希望能找到运维的实习吖 O(≧▽≦)OLinux的终端终端组成部分Linux关机命令shoutdown-hnow(正常关机)halt(关闭内存)init0使用VMware备......
  • MapReduce学习二之WordCount案例
    一、案例概述1、第一步--变成偏移量的K1,V1(这一步不需要我们自己写)2、进入Map阶段输出新的<K2,V2>的键值对;3、Shuffle阶段分区、排序、规约、分组输出新的键值对:4、Reduce阶段转换为<K3,V3>的新的形式的键值对;利用TextOutputFormat的类实现结果的输出;二、具体实践1......
  • 活动报名与缴费小程序开发笔记一
    项目背景活动报名与缴费小程序的开发背景主要源于以下几个因素:1.数字化时代的需求:随着移动互联网和智能手机的普及,人们习惯使用手机进行各种活动。传统的纸质报名表格和线下缴费方式变得相对繁琐,而数字化报名与缴费小程序提供了更便捷的解决方案。2.提高效率和减少人力成本:对于活......
  • 流畅的python笔记 (二) 2.序列构成的数组
    内置序列类型分类1:容器序列(能存放不同类型):list,tuple,collections.deque扁平序列(不能存放不同类型):str,bytes,bytearray,memoryview,array.array分类2:可变序列(能被修改):list,bytearray,array.array,collections.deque,memoryview不可变序列:tuple,str,bytes列表推导......
  • R语言学习1
    R也是一种为统计计算和绘图而生的语言和环境,它是一套开源的数据分析解决方案,1免费:多数商业统计软件价格不菲,投入成千上万美元都是可能的。而R是免费的!如果你是一位教师或一名学生,好处显而易见。2R是一个全面的统计研究平台,提供了各式各样的数据分析技术。几乎任何类型的数据......