线性基学习

之前是假会,现在是真会。而且我还写了博客。不写博客的东西总有一天会忘。

概述

对于线性基中所有的子集的异或和的集合与线性基中的插入所有数的所有子集的异或和的集合相等。

即线性基代表了原数集中的所有异或和。

线性基中所有子集的异或和两两不同。继而不同的异或和数=\(2^{|线性基|}\)。

操作

插入

从高位往低位枚举,若这位上已有数,则异或上这个数后继续,否则将这位赋为当前的数。

查是否存在

从高位往低位枚举,若这位上有数则异或上这个数。当当前值在某时刻=0时说明存在。

查最大异或和

开始答案=0。从高位往低位枚举,若异或上这个数使答案增大则异或。

查与\(x\)异或的最大异或和

开始答案=\(x\),之后查最大异或和。

查最小异或和

答案即为最低的有数的位的数。

查k小异或和

先将线性基重构为线性无关的形式,即若一位上有数,则其他位上的这一位皆为0。如\(\{101101,11111,1010,110\}\)变为\(\{100001,10011,1010,110\}\)。

然后将\(k\)拆为二进制,从低位往高位枚举,若k&(1<<i)则答案异或上第\(i\)大的位的数。

原文地址:https://www.cnblogs.com/utopia999/p/9721484.html

时间: 2024-07-30 22:04:55

线性基学习的相关文章

线性基 学习笔记

ps:做CF的时候碰到了一个线性基的概念,然后在网上学习了一下,发现相关的资料很少,所以打算来写一个我个人的理解. 线性代数中 有极大线性无关组和空间的基的概念.  线性基的性质与此类似. 首先来看一个问题: 给出N个数,要从中选出一个最大的子集,使得子集中的任意个元素异或值不为0. 这个和极大线性无关组有些类似.异或可以看出是模2域下的加法运算,如果把一个数转化为二进制,对应成一个由01构成的向量, 所有这些向量就构成了一个线性空间. 原问题就转化为求这个向量组的极大线性无关组,把这样一个极大

codeforces 1100F Ivan and Burgers 线性基 离线

题目传送门 题意: 给出 n 个数,q次区间查询,每次查询,让你选择任意个下标为 [ l , r ] 区间内的任意数,使这些数异或起来最大,输出最大值. 思路:离线加线性基. 线性基学习博客1 线性基学习博客2 对于此题,先把区间按照 r 从小到大排序,然后依次处理这些区间,每次插入线性基时,优先保留下标比较大的线性基.查询时,只异或上下标大于 l 的值. 记住异或的符号的优先级很低,所以  if( res^p[i] > res )这样的代码是会wa死的,要注意(这道题这么写,样例都过不了) #

学习:数学----线性基

线性基主要解决关于一些数的异或等问题,其中包括解决一堆数中任意几个数异或的最大值,最小值,第k大值等等. 线性基介绍及特点 前言 线性基对于萌新来说刚开始学肯定有点难度的,网上很多博客都把线性基讲复杂了(一开始就讲什么线性无关,什么张成),虽然学过线性代数再来理解线性基的确很容易,但是没学过线性代数而来学习线性基却也没有很多很难得地方(至少你知道异或吧). 所以写这篇博客直接从线性基的特点和作用来讲解,进而来讲其他操作,不会非常涉及到线性代数的某些专业知识. 线性基的组成 当我们有了一组确切的数

hdu3949(线性基,求第k小的异或和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4731    Accepted Submission(s): 1658 Problem Description XOR is a kind of bit operator, we

线性基初探

关于线性基的学习与理解 1.线性基: 若干数的线性基是一组数\(a_1,a_2,...a_n\)其中\(a_x\)的最高位的1在第x位. 通过线性基中元素\(xor\)出的数的值域与原来的数\(xor\)出数的值域相同. 2.线性基的构造法: 对每一个数\(p\)从高位到低位扫,扫到第\(x\)位为1时,若\(a_x\)不存在,则\(a_x=p\)并结束此数的扫描,否则令\(p=pxora_x\). 3.查询: 用线性基求这组数\(xor\)出的最大值:从高往低扫\(a_x\),若异或上\(a_

Xor HYSBZ - 2115 (线性基)

Xor HYSBZ - 2115 题意:给一个树,求1到n的最长路径.这里的路径定义为异或和. 线性基~~ 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 struct LiBase{ 5 ll a[63]; 6 //初始化 7 void init(){ 8 memset(a,0,sizeof(a)); 9 } 10 //插入 11 bool insert_(ll x){ 12 for(int

线性基小节

1.线性基的异或集合中每个元素的异或方案唯一. 2.线性基二进制最高位互不相同. 3.线性基中元素互相异或,异或集合不变. 摘自百度文库 线性基能相互异或得到原集合的所有相互异或得到的值. 线性基是满足性质1的最小的集合 线性基没有异或和为0的子集. 证明: 反证法:设线性基S={a1,a2...,an}: 若有子集a1^a2^...^at=0,则a1=a2^a3^...^at,则舍弃a1后一定能通过剩余的元素异或出所有需要a1参与异或的值.设Y=a1^X,因为{a1,a2,...,an}是一组

[BeiJing2011]元素[贪心+线性基]

2460: [BeiJing2011]元素 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1245  Solved: 652[Submit][Status][Discuss] Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们为了获取更强的法力而使用了很多矿石,却在炼制过程中

BZOJ 3105: [cqoi2013]新Nim游戏 [高斯消元XOR 线性基]

以后我也要用传送门! 题意:一些数,选择一个权值最大的异或和不为0的集合 终于有点明白线性基是什么了...等会再整理 求一个权值最大的线性无关子集 线性无关子集满足拟阵的性质,贪心选择权值最大的,用高斯消元判断是否和已选择的线性相关 每一位记录pivot[i]为i用到的行 枚举要加入的数字的每一个二进制为1的位,如果有pivot[i]那么就异或一下(消元),否则pivot[i]=这个数并退出 如果最后异或成0了就说明线性相关... #include <iostream> #include &l