题目链接

题意

给定\(n\)个数,对其每一个子集计算异或和,求第\(k\)小的异或和。

思路

先求得线性基。

同上题,转化为求其线性基的子集的第k小异或和

结论

记\(n\)个数的线性基为向量组\(B=\{b_0,b_1,b_2,...,b_t\}(有b_i[p_i]=1,p_1\lt p_2\lt ...\lt p_t)\),记\(k\)的二进制表示为向量\(\vec{K}\).

则第\(k\)小异或和为$$\oplus_{\vec{K}[i]=1}b_i$$

即\(k\)的二进制表示中为\(1\)的那些位所对应的线性基中的向量异或起来的值。

正确性证明

对于任意的\(1\leq i\lt j\leq tot(tot\)为子集的总个数,也即异或和的总个数)

记\(i\)的二进制表示为\(\vec{I}\),\(j\)的二进制表示为\(\vec{J}\),设从高到低的\(\vec{I}\)与\(\vec{J}\)第一个不同的位为第\(pos\)位,因为\(i\lt j\),故有\(\vec{I}[pos]=0, \vec{J}[pos]=1\).

记第\(i\)小异或值为\(ii\),第\(j\)小异或值为\(jj\),对应的向量分别为\(\vec{II}, \vec{JJ}\). 根据上述构造第\(k\)小值的方法,构造\(\vec{II}\)时没有异或\(b_{pos}\),而构造\(\vec{JJ}\)时异或了\(b_{pos}\). 又由线性基的性质,只有\(b_{pos}[p_{pos}]=1\),故有\(\vec{II}[p_{pos}]=0, \vec{JJ}[p_{pos}]=1\).

即\(\vec{II}\)与\(\vec{JJ}\)高位都相同,第\(p_{pos}\)位\(\vec{JJ}\)大,故\(\vec{II}\lt \vec{JJ}\),即\(ii\lt jj\).

所以\(i\lt j\rightarrow ii\lt jj\),所以\(rank(i)=rank(ii)\),得到了一一对应的关系,故构造的正确性得证。

注意点

如果原\(n\)个数表示成的\(01\)串线性相关,那么除了可以用线性基线性组合而得的\(2^r-1\)个数外,另有最小的异或和为\(0\).

Code

#include <bits/stdc++.h>
#define maxl 60
#define LL long long
using namespace std;
struct LinearBasis {
LL a[maxl+1]; bool rel; int sz;
vector<LL> v;
LinearBasis() { memset(a, 0, sizeof a); rel = false; sz = 0; v.clear();}
void insert(LL t) {
for (int i = maxl; i >= 0; --i) {
if (!(t >> i & 1)) continue;
if (a[i]) t ^= a[i];
else {
for (int j = 0; j < i; ++j) if (t >> j & 1) t ^= a[j];
for (int j = i+1; j <= maxl; ++j) if (a[j] >> i & 1) a[j] ^= t;
a[i] = t, ++sz;
return;
}
}
rel = true;
}
void basis() {
for (int i = 0; i <= maxl; ++i) if (a[i]) v.push_back(a[i]);
}
LL kth(LL x) {
LL ret = 0;
for (int i = 0; i < v.size(); ++i) if (x >> i & 1) ret ^= v[i];
return ret;
}
};
int kas;
void work() {
int n, q; LL x;
scanf("%d", &n);
LinearBasis lb;
for (int i = 0; i < n; ++i) {
scanf("%lld", &x);
lb.insert(x);
}
lb.basis(); scanf("%d", &q);
printf("Case #%d:\n", ++kas); LL tot = (1LL << lb.sz) - 1;
for (int i = 0; i < q; ++i) {
scanf("%lld", &x);
if (lb.rel) --x;
if (x > tot) puts("-1");
else printf("%lld\n", lb.kth(x));
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) work();
return 0;
}

hdu 3949 XOR 线性基 第k小异或和的更多相关文章

  1. hdu 3949 XOR (线性基)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题 ...

  2. HDU 3949 XOR [线性基|高斯消元]

    目录 题目链接 题解 代码 题目链接 HDU 3949 XOR 题解 hdu3949XOR 搞死消元找到一组线性无关组 消出对角矩阵后 对于k二进制拆分 对于每列只有有一个1的,显然可以用k的二进制数 ...

  3. HDU 3949 XOR 线性基

    http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不 ...

  4. HDU3949 XOR(线性基第k小)

    Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...

  5. HDU 3949 XOR (线性基第k小)题解

    题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一 ...

  6. HDU 3949 XOR ——线形基 高斯消元

    [题目分析] 异或空间的K小值. 高斯消元和动态维护线形基两种方法都试了试. 动态维护更好些,也更快(QAQ,我要高斯消元有何用) 高斯消元可以用来开拓视野. 注意0和-1的情况 [代码] 高斯消元 ...

  7. HDU3949 XOR (线性基)

    HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two bin ...

  8. HDU 3949 XOR(高斯消元搞基)

    HDU 3949 XOR pid=3949" target="_blank" style="">题目链接 题意:给定一些数字,问任取几个异或值第 ...

  9. HDU 3949 XOR [高斯消元XOR 线性基]

    3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选 ...

随机推荐

  1. 搭建cdh单机版版本的hive所遇到的问题总汇

    今天按照网上教程搭建了下 cdh 单机版的 hive  将相关配置记录下来 以便以后方便翻阅 版本 hive-0.13.1-cdh5.3.6.tar.gz 1. 直接解压 然后将 mysql驱动包 拷 ...

  2. CodeForces - 996B

    Allen wants to enter a fan zone that occupies a round square and has nn entrances. There already is ...

  3. 信息收集之zoomeye

    一.浏览器上使用api接口 1.https://api.zoomeye.org/user/login post传参:{"username" : "username&quo ...

  4. Oracle笔记之序列(Sequence)

    Oracle中序列是一种数据对象,可以视为一个等差数列,我们自增就是一个遍历这个数列的过程,可以取当前值,也可以将当前值自加n后返回,Sequence与表没有太大的关系,有的时候如果表的主键是数值类型 ...

  5. spring3-spring的事务管理机制

    1. Spring的事务管理机制 Spring事务管理高层抽象主要包括3个接口,Spring的事务主要是由他们共同完成的: PlatformTransactionManager:事务管理器—主要用于平 ...

  6. 记一次powershell反混淆(2)

    样本地址 https://www.hybrid-analysis.com/sample/4b4b8b13c264c8f7d7034060e0e4818a573bebc576a94d7b13b4c174 ...

  7. python ORM - sqlalchemy 操作使用

    python操作数据库 使用 ORM - sqlalchemy,pymsql 安装: pip install pymsq pip install sqlalchemy 一. '''连接数据库'''   ...

  8. 自定义事件的触发dispatchEvent

    1. 对于标准浏览器,其提供了可供元素触发的方法:element.dispatchEvent(). 不过,在使用该方法之前,我们还需要做其他两件事,及创建和初始化.因此,总结说来就是: documen ...

  9. JDK动态代理小例子

    一个小汽车,有一个跑run()的方法,我们想使用jdk动态代理使小汽车执行run之前 加点油,run之后洗车. 有四个类,接口Car(小汽车)Kayan(具体实现类(卡宴)) CarProxy(汽车的 ...

  10. python discover 函数介绍

    discover(start_dir,pattern='test*.py',top_level_dir=None)找到指定目录下所有测试模块,并可递归查到子目录下的测试木块,只有匹配到的文件名才会被加 ...