线性寄
定义
线性基是一个数的集合,取线性基中若干个数异或起来可以得到原序列中的任何一个数。
我们设 为线性基的集合, 为原数组。
那么 都能被若干个 内的元素的异或和表示出来。
用途:
通常可以解决有关异或的一些题目。
线性基的性质:
- 的最高位不同。
- 中没有异或和为 的子集。
算法流程:
前置知识:
a ^ b = c 等价于 a = c ^ b a ^ b ^ b = a
异或的简单性质,至于证明 ~这你都不会快退役叭。
我们设 代表的是最高有效位为第i位的线性基的向量。
浅显易懂
首先我们要满足原数组的数能被线性基的子集表示。
当我们要插入一个数 。
- 从高位向低位判断,直到遇到该元素某位上为 ,设该位为 。
- 然后判断 是否有值,如果没有把 存到 中,否则将 与 异或然后重复上面的操作。
来证明一下为啥这样构造是对的,也就是为啥都能用线性基表示出来:
-
如果 无值,则 ,显然能表示出来。
-
如果 有值, ,然后假设他会在 被加进线性基中,,
然后 。所以 也被表示出来了。
所以该构造方案是正确的。
于是我们可以写出代码:
void add(int x) { for(int i = 63; i >= 0; i--) { if(x & (1ll << i)) { if(p[i]) x ^= p[i]; else { p[i] = x; break;} } } }
本文作者:TLE_Automation
本文链接:https://www.cnblogs.com/tttttttle/p/16296228.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现