「线性基」学习笔记and乱口胡总结
还以为是什么非常高大上的东西花了1h不到就学好了
线性基
线性基可以在\(O(nlogx)\)的时间内计算出\(n\)个数的最大异或和(不需要相邻)。
上述中\(x\)表示的最大的数。
如何实现
定义\(p[i]\)表示在二进制下从最高位开始第一个出现\(1\)的数。
当前我们将一个数插入线性基中。
如果\(x\)的最高位的\(1\)还没有被插入过,那么就在这一位上插入\(x\)。
如果当前这一位被插入过,那么就异或上这一位上的数。
查询操作:从最高位上开始贪心。
如果异或这一位上的数可以让答案更大,那么就异或,否则就异或。
贪心验证
因为我们从高位往低位贪心,所以不需要考虑低位上的数会让高位上的数变小的情况。
介于我们在插入的时候都是无法匹配的时候,异或上这一位上的数,那么就保证了我们的这个数能够达到自己能用的最大贡献。
代码
#include <bits/stdc++.h>
using namespace std;
const int BIT = 63;
const int N = 52;
typedef long long ll;
ll a[N], p[BIT + 2];
int n;
void ins(ll x) {
for (int i = BIT; ~i; i --) {
if ((x >> i) == 0) continue;
if (!p[i]) { p[i] = x; break; }
x ^= p[i];
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++) cin >> a[i];
for (int i = 1; i <= n; i ++) ins(a[i]);
for (int i = 0; i <= BIT; i ++) cout << i << " " << p[i] << endl; cout << endl;
ll ans = 0;
for (int i = BIT; ~i; i --)
if ((ans ^ p[i]) > ans) ans ^= p[i];
cout << ans << endl;
return 0;
}
「线性基」学习笔记and乱口胡总结的更多相关文章
- 高斯消元 & 线性基【学习笔记】
高斯消元 & 线性基 本来说不写了,但还是写点吧 [update 2017-02-18]现在发现真的有好多需要思考的地方,网上很多代码感觉都是错误的,虽然题目通过了 [update 2017- ...
- 「CF724G」Xor-matic Number of the Graph「线性基」
题意 求所有点对\(u,v\),\(u\)到\(v\)所有不同的异或路径的异或值之和,对\(10^9+7\)取模 题解 求出一个dfs树,那么\(u\)到\(v\)的路径一定是树上路径异或一些环.这些 ...
- Note -「Lagrange 插值」学习笔记
目录 问题引入 思考 Lagrange 插值法 插值过程 代码实现 实际应用 「洛谷 P4781」「模板」拉格朗日插值 「洛谷 P4463」calc 题意简述 数据规模 Solution Step 1 ...
- Note -「动态 DP」学习笔记
目录 「CF 750E」New Year and Old Subsequence 「洛谷 P4719」「模板」"动态 DP" & 动态树分治 「洛谷 P6021」洪水 「S ...
- Note -「单位根反演」学习笔记
\(\mathcal{Preface}\) 单位根反演,顾名思义就是用单位根变换一类式子的形式.有关单位根的基本概念可见我的这篇博客. \(\mathcal{Formula}\) 单位根反演的 ...
- 「Manacher算法」学习笔记
觉得这篇文章写得特别劲,插图非常便于理解. 目的:求字符串中的最长回文子串. 算法思想 考虑维护一个数组$r[i]$代表回文半径.回文半径的定义为:对于一个以$i$为回文中心的奇数回文子串,设其为闭区 ...
- 「FHQ Treap」学习笔记
话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...
- 「Link-Cut Tree」学习笔记
Link-Cut Tree,用来解决动态树问题. 宏观上,LCT维护的是森林而非树.因此存在多颗LCT.有点像动态的树剖(链的确定通过$Access$操作),每条链用一颗$splay$维护.$spla ...
- 「AC自动机」学习笔记
AC自动机(Aho-Corasick Automaton),虽然不能够帮你自动AC,但是真的还是非常神奇的一个数据结构.AC自动机用来处理多模式串匹配问题,可以看做是KMP(单模式串匹配问题)的升级版 ...
随机推荐
- CPP内存检测
对C.C++的内存泄露.内存溢出等检查,经过这两天的查资料,总体来说可以使用Valgrind, AddressSanitizer, Dr.Memory等.其中Valgrind对程序运行速度影响较大,运 ...
- Android为TV端助力 播放视频卡顿问题
问题分析: 1.连接服务器,ping IP 看看有没有丢包 2.写一个只有mediaplayer的Demo,放到同款的盒子或者电视,保证网咯也是一样的情况下,看看Demo卡不卡 如果一直不卡,那有可能 ...
- MySQL 基础知识梳理学习(四)----GTID
在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制.GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高. 1 ...
- SQL语句(理论)
1.SQL已经成为关系数据库的标准语言 2.SQL是一个非过程化的语言,因为他一次处理一个记录 3.SQL命令比较简单,最高级的命令几天之内便可掌握. 有属下类型的命令: 查询数据. 在表中插入.修改 ...
- 在Visual Studio 2017上配置并使用OpenGL
在Visual Studio 2017上配置并使用OpenGL 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 首先在Windows下安装Visual ...
- 爬虫系列---scrapy post请求、框架组件和下载中间件+boss直聘爬取
一 Post 请求 在爬虫文件中重写父类的start_requests(self)方法 父类方法源码(Request): def start_requests(self): for url in se ...
- webpack开发环境和生产环境切换原理
在package.json中有如下设置: "scripts": { "dev": "node build/dev-server.js" ...
- 【转】Vue.js中 watch 的高级用法
假设有如下代码: <div> <p>FullName: {{fullName}}</p> <p>FirstName: <input type=&q ...
- 为什么 npm 要为每个项目单独安装一遍 node_modules?
nodejs中package.json中的依赖必须每个项目都有自己的node_modules文件夹,而无法在多个项目之间共用一套node_modules(像Java中的Maven那样). 依赖管理是每 ...
- Shiro学习(一)——Shiro简介
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...