[学习笔记]省选(算法?数据结构?)·线性基
一、开头
神犇MX:怎么样?xyz32768,你学不会后缀自动机,真是菜啊!
xyz32768:是啊,我本来就很菜啊!
神犇MX:你不服的话,再考你一道题:给定一个nnn个数的数集,求一个子集,使这个子集的xor" role="presentation" style="position: relative;">xorxor\mbox{xor}和最大?只需要输出这个xorxor\mbox{xor}和。n≤105n≤105n\leq 10^5并且每个数不大于2602602^{60}。
xyz32768:爆搜子集,O(2n)O(2n)O(2^n),我好像只会这样了。
神犇MX:看来你还是太菜,连线性基都不会,怎么可能会后缀自动机呢?
xyz32768:啊啊啊啊啊啊啊啊啊啊啊啊啊啊……(省略109999991099999910^{999999}个“啊”)
二、介绍
一个nnn个数的正整数集合S" role="presentation" style="position: relative;">SSS,这个集合的线性基是一个mmm个正整数的集合:
A=\{a_1,a_2,a_3,...,a_m\}
线性基有两点性质:
①:如果存在S′⊂SS′⊂SS'\subset S且S′S′S'内元素的xorxor\mbox{xor}和为ttt,那么就一定存在A′⊂A" role="presentation" style="position: relative;">A′⊂AA′⊂AA'\subset A且A′A′A'内的元素的xorxor\mbox{xor}和为ttt,反过来也一样。简单的说,通过A" role="presentation" style="position: relative;">AAA集合内的元素xorxor\mbox{xor}出的值域与通过SSS集合内的元素xor" role="presentation" style="position: relative;">xorxor\mbox{xor}出的值域相同。
②:线性基还有一个重要的性质:对于任何一个iii,要么ai" role="presentation" style="position: relative;">aiaia_i不存在,要么aiaia_i最高位的111在第i" role="presentation" style="position: relative;">iii位上。
三、构造(插入一个新数)
集合SSS为空时,线性基即集合A" role="presentation" style="position: relative;">AAA的每一个元素(即a1,a2,...a1,a2,...a_1,a_2,...)都不存在。
向线性基中插入新数ppp的方法:
从高到低扫描p" role="presentation" style="position: relative;">ppp的每一个二进制位,扫描到ppp的第i" role="presentation" style="position: relative;">iii位为111时,分两种情况:
如果ai" role="presentation" style="position: relative;">aiaia_i不存在,那么令ai=pai=pa_i=p并且结束扫描。
否则令p=p xor aip=pxor aip=p\mbox{ xor }a_i并继续扫描。
简单解释:假设插入新数ppp之前的线性基为A′" role="presentation" style="position: relative;">A′A′A',设A′A′A'满足线性基的两个性质,那么在aiaia_i不存在并且ppp最高位的1" role="presentation" style="position: relative;">111在第iii位的情况下,令ai=p" role="presentation" style="position: relative;">ai=pai=pa_i=p,得到的线性基仍然满足性质。
而在aiaia_i存在的情况下令p=p xor aip=pxor aip=p\mbox{ xor }a_i是为了使ppp的第i" role="presentation" style="position: relative;">iii位为000,以此维护性质②。这时候p" role="presentation" style="position: relative;">ppp异或上aiaia_i之后等于待插入的新数,而两个相等的数的异或值总是000,这时候仍然满足线性基的性质①。
代码(代码中的orz" role="presentation" style="position: relative;">orzorzorz表示线性基,orzi=−1orzi=−1orz_i=-1就表示orziorziorz_i不存在):
void ins(ll p) {int i; for (i = m; i; i--) {if (!((p >> i - 1) & 1)) continue;if (orz[i] == -1) return (void) (orz[i] = p);else p ^= orz[i];}
}
合并两个线性基,就是把一个线性基中的元素暴力插入到另一个线性基里面。
代码:
cyx mer(cyx a, cyx b) {int i; for (i = m; i; i--)a.ins(b.orz[i]);return a;
}
四、查询
1、最大异或和
贪心。从高往低扫aaa,对于一个ai" role="presentation" style="position: relative;">aiaia_i,如果aiaia_i存在,并且异或上aiaia_i后会使结果更大,就异或上aiaia_i。通过性质②可以得出正确性。
代码:
ll max_xor() {int i; ll ans = 0; for (i = m; i; i--)if ((ans ^ orz[i]) > ans) ans ^= orz[i];return ans;
}
2、一个数ppp能否被异或出
贪心,同样是利用性质②。首先记下res=0" role="presentation" style="position: relative;">res=0res=0res=0。从高往低扫aaa。
对于一个ai" role="presentation" style="position: relative;">aiaia_i,如果aiaia_i存在,并且resresres的第iii位与p" role="presentation" style="position: relative;">ppp的第iii位不等,则使res=res xor ai" role="presentation" style="position: relative;">res=res xor aires=res xor aires=res\mbox { xor }a_i。
如果最后res=pres=pres=p,那么ppp能被异或出。当然需要特判0" role="presentation" style="position: relative;">000:
如果SSS中有0" role="presentation" style="position: relative;">000,或者在构建线性基的过程中,存在一个待插入的数kkk使得插入之前k" role="presentation" style="position: relative;">kkk能被异或出,那么存在一个非空子集的异或和为000。
代码(不加特判0" role="presentation" style="position: relative;">000):
bool _xor(ll p) {int i; ll res = 0;for (i = m; i; i--) {if (orz[i] == -1) continue;if (((p >> i - 1) & 1) != ((res >> i - 1) & 1))res ^= orz[i];}return res == p;
}
五、题目
(待补充)
[学习笔记]省选(算法?数据结构?)·线性基相关推荐
- R语言与机器学习学习笔记(分类算法)
转载自:http://www.itongji.cn/article/0P534092014.html 人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经 ...
- CCC3.0学习笔记_数字密钥数据结构
CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...
- 《基于张量网络的机器学习入门》学习笔记8(Shor算法)
<基于张量网络的机器学习入门>学习笔记8 Shor算法 来源 Shor算法的大致流程 因数分解 周期求取与量子傅里叶变换(QFT) Shor算法 来源 1994 1994 1994年,应用 ...
- 【学习笔记】【算法】【智能优化】粒子群优化(PSO)
[学习笔记][算法][智能优化]粒子群优化(PSO) 文章目录 [学习笔记][算法][智能优化]粒子群优化(PSO) 1 算法背景 1.1 背景 1.2 基础知识 2 算法原理 2.1 基本原理 2. ...
- 【学习笔记】网络流算法简单入门
[学习笔记]网络流算法简单入门 [大前言] 网络流是一种神奇的问题,在不同的题中你会发现各种各样的神仙操作. 而且从理论上讲,网络流可以处理所有二分图问题. 二分图和网络流的难度都在于问题建模,一般不 ...
- 点云学习笔记11——VoxelNet算法+代码运行
点云学习笔记11--VoxelNet算法+代码运行 一.算法分析 摘要 介绍 相关工作 1.2. 贡献 2.VoxelNet 2.1.特征学习网络 2.1.1 特征学习网络 二.代码复现 2.1.环境 ...
- GIT学习笔记(5):变基
GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...
- 学习笔记------人工蜂群算法
学习笔记------人工蜂群算法 为了解决多变量函数优化问题Karaboga在2005年提出了人工蜂群算法ABC模型. 1. 蜜蜂采蜜机理 蜜蜂是一种群居昆虫,虽然单个昆虫的行为极其简单,但是由单个简 ...
- GMM高斯混合模型学习笔记(EM算法求解)
提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...
最新文章
- wpsppt怎样让图片模糊_图片优化的14个技巧!
- 【转】简单介绍几个CDS视图聚合函数
- 8266串口调试助手_200行Python代码实现串口调试助手(2) 界面构建
- 前端学习(1709):前端系列javascript之uniapp
- 利用钩子机制取得Windows的消息监控权
- 模块使用:time、datetime、calendar、sys、os、os.path、normcase和normapath、random、json、pickle...
- Hdu 1303 Doubles
- paip. http 405 的解决..
- Xshell/Xftp个人完全免费版
- 软件测试流程(完整版)
- 服务器怎么用iso文件装系统,ISO镜像文件能直接安装吗 怎么使用iso镜像文件安装系统...
- 如何解决手机retina显示屏下的1px太粗问题
- 支付公司如何赚钱?支付网关如何设计?
- 电梯继续上升,到几楼,才会发现事情真相呢?
- 微信退款No appropriate protocol (protocol is disabled or cipher suites are inappropriate)问题解决
- 信用评分的简单小结(ROC,IV,WOE)
- Mac 系统不兼容移动硬盘无法识别怎么办
- 表格中复制粘贴到其他位置的数据会携带引号等不可见字符
- 滴滴出行,能否引入大数据风控技术保障乘客安全?
- python模拟币乎登录