寄寄寄寄寄寄寄寄寄寄寄寄寄寄寄寄|

TLE_Automation

园龄:2年9个月粉丝:19关注:23

线性寄

定义

线性基是一个数的集合,取线性基中若干个数异或起来可以得到原序列中的任何一个数。

我们设 P 为线性基的集合,a 为原数组。

那么 ai 都能被若干个 P 内的元素的异或和表示出来。

用途:

通常可以解决有关异或的一些题目。

线性基的性质:

  • Pi 的最高位不同。
  • Pi 中没有异或和为 0 的子集。

算法流程:

前置知识:

a ^ b = c 等价于 a = c ^ b
a ^ b ^ b = a

异或的简单性质,至于证明 ~这你都不会快退役叭

我们设 Pi 代表的是最高有效位为第i位的线性基的向量

浅显易懂

首先我们要满足原数组的数能被线性基的子集表示。

当我们要插入一个数 x

  • 从高位向低位判断,直到遇到该元素某位上为 1,设该位为 i
  • 然后判断 pi 是否有值,如果没有把 x 存到 pi 中,否则将 xpi 异或然后重复上面的操作。

来证明一下为啥这样构造是对的,也就是为啥都能用线性基表示出来:

  • 如果 pi 无值,则 pi=ai ,显然能表示出来。

  • 如果 pi 有值, ai=ai xor pi,然后假设他会在 pij 被加进线性基中,pij=ai xor pi

    然后 pi xor pij=pi xor ai xor pi=ai。所以 ai 也被表示出来了。

    所以该构造方案是正确的。

于是我们可以写出代码:

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 中国大陆许可协议进行许可。

posted @   TLE_Automation  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起