题意:

给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1。

思路:

先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一组基线性基,然后按\(k\)的二进制找地k小。因为线性基不保存0,所以对有0的情况要进行特判。

代码:

#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<stack>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 1000 + 5;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
struct Liner_Basis{
ll d[63], nd[63];
int tot, flag;
void init(){
memset(d, 0, sizeof(d));
memset(nd, 0, sizeof(nd));
tot = flag = 0;
}
bool insert(ll x){
for(int i = 62; i >= 0; i--){
if(x & (1LL << i)){
if(d[i]) x ^= d[i];
else{
d[i] = x;
return true;
}
}
}
flag = 1;
return false;
}
void rebuild(){
for(int i = 62; i >= 0; i--){
if(d[i] == 0) continue;
for(int j = i - 1; j >= 0; j--){
if(d[i] & (1LL << j)) d[i] ^= d[j];
}
}
for(int i = 0; i <= 62; i++){
if(d[i]) nd[tot++] = d[i];
}
}
ll kth_min(ll k){
if(flag) k--;
if(k == 0) return 0;
if(k >= (1LL << tot)) return -1;
ll ret = 0;
for(int i = 62; i >= 0; i--){
if(k & (1LL << i)){
ret ^= nd[i];
}
}
return ret;
}
}lb;
int main(){
int T, ca = 1;
scanf("%d", &T);
while(T--){
int n;
ll x;
scanf("%d", &n);
lb.init();
for(int i = 1; i <= n; i++){
scanf("%lld", &x);
lb.insert(x);
}
lb.rebuild();
int q;
scanf("%d", &q);
printf("Case #%d:\n", ca++);
while(q--){
scanf("%lld", &x);
printf("%lld\n", lb.kth_min(x));
}
}
return 0;
}

HDU 3949 XOR (线性基第k小)题解的更多相关文章

  1. hdu 3949 XOR 线性基 第k小异或和

    题目链接 题意 给定\(n\)个数,对其每一个子集计算异或和,求第\(k\)小的异或和. 思路 先求得线性基. 同上题,转化为求其线性基的子集的第k小异或和. 结论 记\(n\)个数的线性基为向量组\ ...

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

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

  3. hdu 3949 XOR (线性基)

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

  4. HDU 3949 XOR 线性基

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

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

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

  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. 微信登录1-OAuth2简介

    一.OAuth2解决什么问题 1.开放系统间授权 照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源 2.图例 资源拥有者:照片拥有者 客户应用:云冲印 受保护的资源:照片 3 ...

  2. Java集合List-差集、并集、交集

    Java集合List的差集.并集.交集 转载于:https://www.cnblogs.com/qlqwjy/p/9812919.html 一.List的差集 @Test public void te ...

  3. 关于springboot2.X使用外部tomcat服务器进行部署的操作详细步骤

    1.修改pom.xml文件(4个地方) ①<packaging>war</packaging>将其中的jar该为war ②<dependency> <grou ...

  4. 转 jmeter测试手机号码归属地

    jmeter测试手机号码归属地   jmeter测试手机号码归属地接口时,HTTP请求有以下两种书写方法: 1.请求和参数一同写在路径中 2.参数单独写在参数列表中 请求方法既可以使用GET方法又可以 ...

  5. Mybatis总结(一)

    Mybatis总结(一) 一.Mybatis启动流程(代码层面) 关于config.xml <?xml version="1.0" encoding="UTF-8& ...

  6. IDEA 2019 Unable to get current time from Google's servers 解决

    取消android support即可

  7. Spark SQL如何选择join策略

    前言 众所周知,Catalyst Optimizer是Spark SQL的核心,它主要负责将SQL语句转换成最终的物理执行计划,在一定程度上决定了SQL执行的性能. Catalyst在由Optimiz ...

  8. 那些我们不知道的 Python 免费学习资料

    作者:小R编辑:AI 兔兔 Python 语言因为其易学,以及强大的功能,是很多刚开始学习编程的入门语言的选择之一. Python 语言被列入中小学教材后引起了越来越多人的关注. 希望孩子学习编程的家 ...

  9. Python学习【第2篇】:基本数据类型

    基本数据类型 字符串 ---------n1 = "xiaoxing"   n2 = "admin"  n3 = "123"  n4 = & ...

  10. Linux CGroup入门

    Linux cgroup Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).L ...