一、开头

神犇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={a1,a2,a3,...,am}" role="presentation" style="text-align: center; position: relative;">A={a1,a2,a3,...,am}A={a1,a2,a3,...,am}

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;
}

五、题目

(待补充)

[学习笔记]省选(算法?数据结构?)·线性基相关推荐

  1. R语言与机器学习学习笔记(分类算法)

    转载自:http://www.itongji.cn/article/0P534092014.html 人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经 ...

  2. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

  3. 《基于张量网络的机器学习入门》学习笔记8(Shor算法)

    <基于张量网络的机器学习入门>学习笔记8 Shor算法 来源 Shor算法的大致流程 因数分解 周期求取与量子傅里叶变换(QFT) Shor算法 来源 1994 1994 1994年,应用 ...

  4. 【学习笔记】【算法】【智能优化】粒子群优化(PSO)

    [学习笔记][算法][智能优化]粒子群优化(PSO) 文章目录 [学习笔记][算法][智能优化]粒子群优化(PSO) 1 算法背景 1.1 背景 1.2 基础知识 2 算法原理 2.1 基本原理 2. ...

  5. 【学习笔记】网络流算法简单入门

    [学习笔记]网络流算法简单入门 [大前言] 网络流是一种神奇的问题,在不同的题中你会发现各种各样的神仙操作. 而且从理论上讲,网络流可以处理所有二分图问题. 二分图和网络流的难度都在于问题建模,一般不 ...

  6. 点云学习笔记11——VoxelNet算法+代码运行

    点云学习笔记11--VoxelNet算法+代码运行 一.算法分析 摘要 介绍 相关工作 1.2. 贡献 2.VoxelNet 2.1.特征学习网络 2.1.1 特征学习网络 二.代码复现 2.1.环境 ...

  7. GIT学习笔记(5):变基

    GIT学习笔记(5):变基rebase 变基 引入变基 在Git中整合来自不同分支的修改主要有两种方法:merge以及rebase. 整合分支最容易的方法是merge,他会把两个分支的最新快照以及两者 ...

  8. 学习笔记------人工蜂群算法

    学习笔记------人工蜂群算法 为了解决多变量函数优化问题Karaboga在2005年提出了人工蜂群算法ABC模型. 1. 蜜蜂采蜜机理 蜜蜂是一种群居昆虫,虽然单个昆虫的行为极其简单,但是由单个简 ...

  9. GMM高斯混合模型学习笔记(EM算法求解)

    提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...

最新文章

  1. wpsppt怎样让图片模糊_图片优化的14个技巧!
  2. 【转】简单介绍几个CDS视图聚合函数
  3. 8266串口调试助手_200行Python代码实现串口调试助手(2) 界面构建
  4. 前端学习(1709):前端系列javascript之uniapp
  5. 利用钩子机制取得Windows的消息监控权
  6. 模块使用:time、datetime、calendar、sys、os、os.path、normcase和normapath、random、json、pickle...
  7. Hdu 1303 Doubles
  8. paip. http 405 的解决..
  9. Xshell/Xftp个人完全免费版
  10. 软件测试流程(完整版)
  11. 服务器怎么用iso文件装系统,ISO镜像文件能直接安装吗 怎么使用iso镜像文件安装系统...
  12. 如何解决手机retina显示屏下的1px太粗问题
  13. 支付公司如何赚钱?支付网关如何设计?
  14. 电梯继续上升,到几楼,才会发现事情真相呢?
  15. 微信退款No appropriate protocol (protocol is disabled or cipher suites are inappropriate)问题解决
  16. 信用评分的简单小结(ROC,IV,WOE)
  17. Mac 系统不兼容移动硬盘无法识别怎么办
  18. 表格中复制粘贴到其他位置的数据会携带引号等不可见字符
  19. 滴滴出行,能否引入大数据风控技术保障乘客安全?
  20. python模拟币乎登录

热门文章

  1. 使用EditPlus技巧
  2. 在学校图书馆里进入WOS却依然无法搜索文献如何解决?
  3. java fxml教程_openjfx(javaFX)完整学习指南(教程)
  4. pandas 分类数据处理大全
  5. BMC通过PECI接口获取CPU温度实现方法
  6. CDN加速和买胡萝卜的关系
  7. 基于python的对比度增强(线性变换、直方图正规化、直方图均衡化、CLAHE)
  8. 如何选择适合你的兴趣爱好(一),拉丁舞
  9. php(magento),magento在本地php7上安装方法
  10. Win10关闭登录面板毛玻璃效果