题目链接

如何求线性基中第K小的异或和?好像不太好做。
如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i])。
这可以重构一下线性基,从高到低位枚举i,如果base[i]在第j位(j<i)有值,那么Xor一下base[j]。(保证每一列只有一个1)
比如 1001(3)与0001(0),同时选0,3只比3要小;重构后是 1000(3)和0001(0),这样同时选0,3比只选0或3都要大。
这样将K二进制分解后就可以直接对应上线性基对应位的选择了。要存base[i]有值的i。

需要注意如果线性基中表示的向量不足n个,说明一定存在一组向量满足线性相关关系,即存在Xor和为0的情况。这样要使K减1。
判断是K>=(1<<size),线性基和的个数是2^{size}-1(不算0)。

#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 100000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Bit 51
typedef long long LL;
const int N=1e5+5;int n,size,cnt;
LL base[69],b2[69];
char IN[MAXIN],*SS=IN,*TT=IN;inline LL read()
{LL now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void Insert(LL x)
{for(int i=Bit; ~i; --i)if(x>>i & 1)if(base[i]) x^=base[i];else {base[i]=x, ++size; break;}
}
inline LL Query(LL K)
{LL ans=0;for(int i=cnt; ~i; --i)if(K>>i & 1) ans^=b2[i];return ans;
}
void Rebuild()
{for(int i=Bit; ~i; --i)for(int j=i-1; ~j; --j)if(base[i]>>j & 1) base[i]^=base[j];for(int i=0; i<=Bit; ++i) if(base[i]) b2[cnt++]=base[i];
}int main()
{n=read();for(int i=1; i<=n; ++i) Insert(read());Rebuild();for(int Q=read(); Q--; ){LL K=read()-(size!=n);//别在for里开int啊mmp printf("%lld\n",(K>=(1ll<<size))?-1ll:Query(K));}return 0;
}

有一种不需要重构线性基的方法:询问时将K二进制拆分(按size位),若K在第j位有1,且当前答案在第i位没有1(还可以更大)或是 K在第j位没有1,且当前答案在第i位有1(偏小?),则ans^=base[i]。
不太理解。(随大流吧。。)

#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 100000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define Bit 51
typedef long long LL;
const int N=1e5+5;int n,size;
LL base[69];
char IN[MAXIN],*SS=IN,*TT=IN;inline LL read()
{LL now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}
inline void Insert(LL x)
{for(int i=Bit; ~i; --i)if(x>>i & 1)if(base[i]) x^=base[i];else {base[i]=x, ++size; break;}
}
inline LL Query(LL K)
{LL ans=0;for(int i=Bit,now=size; ~i; --i)if(base[i])if((K>>(--now) & 1)^(ans>>i & 1)) ans^=base[i];return ans;
}int main()
{n=read();for(int i=1; i<=n; ++i) Insert(read());for(int Q=read(); Q--; ){LL K=read()-(size!=n);printf("%lld\n",(K>=(1ll<<size))?-1ll:Query(K));}return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/9291547.html

LOJ.114.K大异或和(线性基)相关推荐

  1. HDU3949 XOR (线性基、查找第k小值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 我们用高斯消元求出的a1,a2,-,ana_1,a_2, \dots,a_na1​,a2​,-,an​ ...

  2. 区间子集最大/最小异或和问题(线性基,树上差分)

    闲话 有这样一个问题--一个长度为\(n\)的序列\(a_1-a_n\),\(q\)个询问,每次询问\(l,r\),选出\(\{a_l,a_{l+1}...a_{r}\}\)中一个子集使得子集内元素异 ...

  3. 2017年ICPC西安邀请赛A、XOR(线段树套线性基 + 思维)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目传送门 Problem 给你 nnn 和 nnn 个整数的数组 aaa,以及kkk和qqq,有 q ...

  4. 线性代数 —— 线性基与前缀线性基

    [概述] 线性基,是线性代数中的概念,在信息学竞赛中,前缀线性基是线性基的扩展,他们主要用于处理有关异或和的极值问题. 一组线性无关的向量即可作为一组基底,张起一个线性的向量空间,这个基底即称为线性基 ...

  5. 线性基(bzoj 2460: [BeiJing2011]元素)

    线性基: 包含最多h个数(a1, a2, a3, -, ah),其中ak如果存在,那么最高位一定是第k位 性质①:线性基中任意集合xor出来的数的值域 = 原数列任意集合xor出的数的值域 性质②:线 ...

  6. 2017 ICPC西安区域赛 A - XOR ,线段树合并线性基

    题目链接:A - XOR 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后 ...

  7. 【CF1100F】 Ivan and Burgers (分治+线性基)

    description 戳我看题目(づ ̄3 ̄)づ╭❤- solution 异或和最大 --关联线性基 线性基: 原序列的每一个数都能由线性基里若干个数异或得到 线性基里若干个数的异或结果不可能为0 如 ...

  8. 【BZOJ3811】【清华集训2015】玛里苟斯(线性基)

    传送门 解析: 还是挺好想的,首先对于k=1的情况,如果某一个数在这一位上有1,那么最终结果中这一位为1的概率就是0.5. 有一个很显然的性质,所有异或结果出现概率(或者说方案数)相同. 其次,对于k ...

  9. Loj#114-k大异或和【线性基】

    正题 题目链接:https://loj.ac/problem/114 题目大意 nnn个数,求所有非空子集的kkk小异或和. 解题思路 我们考虑处理一下线性基,我们知道对于did_idi​是一定在第i ...

最新文章

  1. cmake找不到opencv解决
  2. RDS PostgreSQL一键大版本升级技术解密
  3. Python中global和nolocal作用域的理解
  4. android动画详解
  5. perl java_与Perl相比Java性能问题
  6. 一文精通CSS文本问题,你值得一看
  7. git安装后找不见版本_结果发现git版本为1.7.4,(git --version)而官方提示必须是1.7.10及以后版本...
  8. 宣化市大专计算机学校,2018张家口专科大学有哪些 最新大专院校名单
  9. phpcms 后台设置 posid 推荐位(支持多选) - 教程篇
  10. ppt中覆盖原有图片文字并且添加新文字的操作方法,有截图
  11. 网络编程---tcp/udp协议
  12. VB6中SendKeys的基本应用
  13. 两款常用的 MQTT 调试工具
  14. linux格式化ext4分区工具,硬盘格式化ext4软件 硬盘格式化ext4
  15. netty权威指南---编解码技术
  16. 数字万用表判断绝缘栅场效应管的好坏
  17. ibus mozc 日文输入法
  18. Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息
  19. C++ 16进制日志输出 每行右侧ASII输出
  20. illustrator插件--常用功能开发--色标生成器--js脚本开发--AI插件

热门文章

  1. 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫
  2. 为你的Web程序加个启动画面
  3. eclipse sdk manager无法更新
  4. linux安装oracle
  5. 黄聪:Loopup集合类笔记
  6. 【matlab-1】工具箱、窗口、变量的存储与加载、帮助
  7. C中的位域与大小端问题
  8. 蓝桥杯 BASIC-15 基础练习 字符串对比
  9. 为什么要对1000000007取模
  10. bluecam连接步骤说明_迈拓维距Type-C扩展坞手机连接电视图文教程