前言

我看网络上没有什么非常系统的教学,可能是我太菜了吧,现在才学,做个记录给自己看。

简略介绍

一个数集能两两异或,能表出许多新的数。

线性基是一个集合,能够在记录最少的数的基础上,表示出一个等价的异或集合。+

常用来解决最大异或子集问题。

下文假设 \(L\) 为值域最大值在二进制下的位数。

构造方法 & 解决问题

插入

bool insert(ll val) {
fd(i, L, 0)
if (val >> i & 1)) {
if (!b[i]) { // b[i] 是记录线性基的数组
b[i] = val;
break;
}
val ^= b[i];
}
return val;
}

如果说 \(\text{val}\) 能被表出,那么它一定会在最后变成 \(0\) 。否则,我们认定下标 \(i\) 的位置放置的数的二进制下第 \(i\) 位一定是 \(1\)。并将它插入。

不难发现,一个插入的数被填进第 \(i\) 位时,其更高位一定被全部异或 \(0\) ,故 \(i\) 是它的最高位 \(1\) 的位置。记住这个性质,会在下面使用。

插入一个数复杂度是 \(O(L)\) 的。

最大异或子集

根据上面的性质,我们从高位贪心地考虑,希望能够尽量让高位的 \(1\) 能够出现。

ll mx() {
ll ret=0;
fd(i, L, 0)
if((ret ^ b[i]) > ret)
ret ^= b[i];
return ret;
}

\(O(L)\)。

合并两个线性基

直接把一个线性基中的元素插入另一个,\(O(L^2)\) 。

求第 \(k\) 小能被表出元素

我们改造这个线性基,使得每一位相互独立。类似高斯消元。从低位到高位消。

void rebuild() {
fo(i, 1, L)
fo(j, 1, i)
if(d[i] >> (j - 1) & 1)
d[i] ^= d[j - 1];
}
ll k_th(ll k) {
// 如果算上零的话需要有特判
if(k == 1 && tot < n) return 0;//特判一下,假如k=1,并且原来的序列可以异或出0,就要返回0,tot表示线性基中的元素个数,n表示序列长度
if(tot < n) --k;//类似上面,去掉0的情况,因为线性基中只能异或出不为0的解
// 记得先 rebuild
ll ret = 0;
fo(i, 1, L)
if(d[i]) {
if(k & 1) ret ^= d[i];
k >>= 1;
}
return ret;
}

顺便一提,实际上 \(\text{rebuild}\) 之后的线性基是完全等价的,可以正常做其他操作。

删除

在线的做法太复杂了一般不考不是很优美,直接说离线吧。

在线性基的每一个位置维护一个最晚插入时间 \(t\) ,那么插入的时候

FOR i=L~0
如果 目前这一位线性基为空
则将目前这一位的线性基附为 (v1,t1)
否则:
将目前这一位的线性基记为 (v2,t2)
如果 t2<t1:
将目前这一位的线性基替换为 (v1,t1)
v2^=v1
用(v2,t2)插入下一位线性基
否则:
v1^=v2
用(v1,t1)插入下一位线性基

在查询的时候只需要看 \(t \ge t_0\) 的位置就好了。

线性基(Linear Basis)学习笔记的更多相关文章

  1. LDA(线性判别分类器)学习笔记

    Linear Discriminant Analysis(线性判别分类器)是对费舍尔的线性鉴别方法(FLD)的归纳,属于监督学习的方法. LDA的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达 ...

  2. ACM线性基学习笔记

    https://www.cnblogs.com/31415926535x/p/11260897.html 概述 最近的几场多校出现了好几次线性基的题目,,会想起之前在尝试西安区域赛的一道区间异或和最大 ...

  3. 高斯消元 & 线性基【学习笔记】

    高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...

  4. 「线性基」学习笔记and乱口胡总结

    还以为是什么非常高大上的东西花了1h不到就学好了 线性基 线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻). 上述中\(x\)表示的最大的数. 如何实现 定义 ...

  5. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...

  6. [JLOI2015]装备购买 题解 / 实数线性基学习笔记

    题目链接 看这道题之前,以为线性基只是支持异或的操作... 那么,我认为这道题体现出了线性基的本质: 就是说如何用最小的一个集合去表示所有出现的装备. 我们假设已经会使用线性基了,那么对于这道题该怎么 ...

  7. Duilib学习笔记《06》— 窗体基类WindowImpBase

    在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...

  8. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...

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

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

随机推荐

  1. Output of C++ Program | Set 1

    Predict the output of below C++ programs. Question 1 1 // Assume that integers take 4 bytes. 2 #incl ...

  2. CentOS6设置Django开发环境

    今天在我的Centos6.5机器上安装 Django 开发环境,在安装完使用 "django-admin.py startproject myapp" 创建应用的时候报了下面的错误 ...

  3. centos7.4 64位安装 redis-4.0.0

    1.  下载 redis 包 链接:https://pan.baidu.com/s/1g1UE_GTreXoD9uOXB7G3HA 提取码:ug8p 2. 安装gcc.ruby .rubygems等环 ...

  4. 自定义 UITableViewCell 的 accessory 样式

    对于 UITableViewCell 而言,其 accessoryType属性有4种取值: UITableViewCellAccessoryNone, UITableViewCellAccessory ...

  5. freeswitch APR-UTIL库消息队列实现

    概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. APR库在之前的文章中已经介绍过了,APR-UTIL库是和APR并列的工具库,它们都是由APACHE开源出来 ...

  6. AOP——面向切面编程

    目录 什么是AOP AOP的作用和优势 作用: 优势: AOP相关术语 AOP的实现方式 使用动态代理的方式 使用XML的方式 使用注解的方式 什么是AOP AOP:全称是Aspect Oriente ...

  7. IDEA 无法显示 Run Dashboard 的解决方法

    前言 最近开始接触微服务的项目,项目很多有时候本地调测需要启动多个项目,看到同事都是使用dashboard管理项目,服务和端口排列的整整齐齐.但是我dashboard里面啥都没有,一顿百度最后解决问题 ...

  8. 优雅的按键模块-----Multi-button

    优雅的按键模块-----Multi-button ​ 在我们日常开发和使用的过程中常常使用了一些按键,利用按键实现不同的功能,比如长按,短按,双击等等.但是每次都是采用标志等等来实现信息的读取,是否有 ...

  9. JAVA发送xml格式的接口请求

    /** * * @param urlStr 接口地址 * @param xmlInfo xml格式参数数据 * @return */ public static String sendMsgXml(S ...

  10. Springboot在工具类(Util)中使用@Autowired注入Service

    1. 使用@Component注解标记工具类MailUtil: 2. 使用@Autowired注入我们需要的bean: 3. 在工具类中编写init()函数,并使用@PostConstruct注解标记 ...