异或线性基学习笔记
前言
本文的线性基指异或线性基。
由于作者太菜了本文的语言不会特别规范。
简介
线性基简称基,它是一个数的集合,并且每个序列都拥有至少一个线性基。
线性基有三个性质:
- 线性基中的几个数异或后不能得到
。 - 线性基中的数在异或后能得到原序列中的所有数。
- 线性基在保证前两个性质时,会使得基内的个数最少。
基本操作
我们用数组
插入
如果
必须选时,如果没有
否则
void insert(int x){
for(int i = 60; ~i; i--)
if(x & (1LL << i))
if(!p[i])return void(p[i] = x);
else x ^= p[i];
}
最大值
我们的二进制最高位是依次递减的。
那么如果
int xormax(){
int ans = 0;
for(int i = 60; ~i; i--)
ans = max(ans, ans ^ p[i]);
return ans;
}
第 k 小
如果我们选择高位后不会对低位影响,那么我们就可以像 BST 求第
所以我们要尽可能把
形如:
10001000
01100000
00010001
00000100
虽然不能全部去掉,但是我们的目的已经达到了。
int kth(int k){
if(f)return 0;
for(int i = 0; i <= 60; i++)
for(int j = i - 1; ~j; j--)
if(p[i] & (1LL << j)) p[i] ^= p[j-1];
int ans = 0;
for(int i = 0; i <= 60; i++)
if(p[i]){
if(k & 1)ans ^= p[i];
k >>= 1;
}
if(k)return -1;
return ans;
}
复杂度
时空复杂度(单次):
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App