题目链接

如何求线性基中第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;
}

LOJ.114.K大异或和(线性基)的更多相关文章

  1. Loj 114 k大异或和

    Loj 114 k大异或和 构造线性基时有所变化.试图构造一个线性基,使得从高到低位走,异或上一个非 \(0\) 的数,总能变大. 构造时让任意两个 \(bas\) 上有值的 \(i,j\) ,满足 ...

  2. [LOJ#114]k 大异或和

    [LOJ#114]k 大异或和 试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,每次给定一个数 k,求一个集合 T⊆S,使得集合 T 在 S 的所有非空子集的不同的异或和中,其异或和  ...

  3. 【loj114】k大异或和 线性基+特判

    题目描述 给由 $n​$ 个数组成的一个可重集 $S​$ ,每次给定一个数 $k​$ ,求一个集合 $T⊆S​$ ,使得集合 $T​$ 在 $S​$ 的所有非空子集的不同的异或和中,其异或和 $T_1 ...

  4. LibreOJ #114. k 大异或和

    二次联通门 : LibreOJ #114. k 大异或和 /* LibreOJ #114. k 大异或和 WA了很多遍 为什么呢... 一开始读入原数的时候写的是for(;N--;) 而重新构造线性基 ...

  5. 【线性基】51nod1312 最大异或和&LOJ114 k大异或和

    1312 最大异或和 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题   有一个正整数数组S,S中有N个元素,这些元素分别是S[0] ...

  6. LOJ114 k大异或和

    传送门 (vjudge和hdu也有但是我觉得LOJ好看!而且限制少!) 不过本题描述有误,应该是k小. 首先我们需要对线性基进行改造.需要把每一位改造成为,包含最高位的能异或出来的最小的数. 为啥呢? ...

  7. 第k大异或值

    这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版: 因为这不需要可持久化: 也就是说求任意两个数异或起来的第k大值: 首先把所有数放进trie里. 然后二分答案,枚举每个数,相应地在 ...

  8. LOJ #113. 最大异或和 (线性基)

    题目链接:#113. 最大异或和 题目描述 这是一道模板题. 给由 \(n\) 个数组成的一个可重集 \(S\),每次给定一个数 \(k\),求一个集合 \(T \subseteq S\),使得集合 ...

  9. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

随机推荐

  1. “榕树下·那年”移动app ( hybrid ) 开发总结

        榕树下网站本身的技术人员并不多,所以app开发的任务就到了母公司盛大文学这边.       盛大文学无线业务中心负责这次具体开发任务.       一如既往的,开发的情况是:时间紧,任务重,人 ...

  2. JavaScript入门--慕课网学习笔记

     JAVASCRIPT—(慕课网)入门篇 我们来看看如何写入JS代码?你只需一步操作,使用<script>标签在HTML网页中插入JavaScript代码.注意, <script&g ...

  3. ActiveMQ实现消息的发送与接受

    activemq是apache的一个JMS接口的实现产品,java中定义了JMS规范,虽然RocketMQ,kafka现在比较火,但是还是建议先学一下activeMQ再学其他两个就容易很多 首先可以下 ...

  4. 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!

    一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...

  5. FPGA设计方法检查表

    -----------------------摘自<FPGA软件测试与评价技术> 中国电子信息产业发展研究院 | 编著------------------------------- 文本格 ...

  6. checkbox 全选和取消

    //全选 $("#checkall").click(function () { if (this.checked) { //如果当前点击的多选框被选中 $('input[type= ...

  7. avalonJS-源码阅读(一)

    写angularJS源码阅读系列的时候,写的太垃圾了.一个月后看,真心不忍直视,以后有机会的话得重写.这次写avalonJS,希望能在代码架构层面多些一点,少上源码.多写思路. avalon暴露句柄方 ...

  8. 利用github pages五分钟建好个人网站+个人博客

    笔者自己在建个人网站/个人博客的时候其实遇到了不少麻烦,但是都一一解决了,这里教给大家最简单的方式. 首先你需要一个GitHub账号,访问https://github.com创建新账号即可. 然后访问 ...

  9. 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)

    Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...

  10. Session和Cookie,Django的自动登录机制

    什么是Cookie? Cookie是浏览器的本地存储机制,存储服务器返回的各种信息,下次发起请求时再发送给服务端,比如访问baidu 什么是Session? 刚才说道,Cookie存储服务端返回的信息 ...