链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949

题意:

给出n个数,从中任意取几个数字异或,求第k小的异或和

思路:

线性基求第k小异或和,因为题目中可以出现异或和为0的情况,但线性基里是不会出现异或和为0的情况,所以我们需要多处理下,将数字全插入到线性基中,如果无法插入也就代表会出现异或和为0的情况,那么求第k小就应该变成求线性基中第k-1小。

实现代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int M = 1e6+;
  5. struct Linear_Basis{
  6. ll b[],nb[],tot;
  7. bool flag = ;
  8. void init(){
  9. flag = ; tot = ;
  10. memset(b,-,sizeof(b));
  11. memset(nb,,sizeof(nb));
  12. }
  13.  
  14. void Insert(ll x){
  15. for(int i = ;i >= ;i --){
  16. if(x&(1LL<<i)){
  17. if(b[i] == -){
  18. b[i] = x;
  19. return ;
  20. }
  21. x ^= b[i];
  22. }
  23. }
  24. flag = ;
  25. return ;
  26. }
  27.  
  28. ll Max(ll x){
  29. ll ret = x;
  30. for(int i = ;i >= ;i --)
  31. ret = max(ret,ret^b[i]);
  32. return ret;
  33. }
  34.  
  35. ll Min(ll x){
  36. ll ret = x;
  37. for(int i = ;i <= ;i ++)
  38. if(b[i]) ret ^= b[i];
  39. return ret;
  40. }
  41.  
  42. void rebuild(){
  43. for(int i = ;i >= ;i --){
  44. if(b[i] == -) continue;
  45. for(int j = i-;j >= ;j --){
  46. if(b[j] == -) continue;
  47. if(b[i]&(1LL<<j)) b[i]^=b[j];
  48. }
  49. }
  50. for(int i = ;i <= ;i ++)
  51. if(b[i]!=-) nb[tot++] = b[i];
  52. }
  53.  
  54. ll K_Min(ll k){
  55. ll res = ;
  56. if(flag == ) k --;
  57. if(k == ) return ;
  58. if(k >= (1LL<<tot))
  59. return -;
  60. for(int i = ;i >= ;i --)
  61. if(k&(1LL<<i))
  62. res ^= nb[i];
  63. return res;
  64. }
  65. }LB;
  66.  
  67. int main()
  68. {
  69. int cas = ,t,n,m;
  70. cin>>t;
  71. while(t--){
  72. LB.init();
  73. cin>>n;
  74. ll x;
  75. for(int i = ;i <= n;i ++){
  76. cin>>x;
  77. LB.Insert(x);
  78. }
  79. LB.rebuild();
  80. printf("Case #%d:\n",cas++);
  81. scanf("%d",&m);
  82. while(m--){
  83. ll k;
  84. scanf("%lld",&k);
  85. printf("%lld\n",LB.K_Min(k));
  86. }
  87. }
  88. return ;
  89. }

hdu 3949 XOR (线性基)的更多相关文章

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

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

  2. HDU 3949 XOR 线性基

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

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

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

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

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

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

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

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

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

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

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

  8. ACM学习历程—HDU 3949 XOR(xor高斯消元)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题目大意是给n个数,然后随便取几个数求xor和,求第k小的.(重复不计算) 首先想把所有xor的 ...

  9. Xor && 线性基练习

    #include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...

随机推荐

  1. Mac安装LNMP环境,升级php7

    Mac安装nginx+mysql+php 安装nginx比较麻烦,要安装pcre       ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre ...

  2. Shell编程基础篇-上

    1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚 ...

  3. 闭包----你所不知道的JavaScript系列(4)

    一.闭包是什么? · 闭包就是可以使得函数外部的对象能够获取函数内部的信息. · 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. · 闭包就 ...

  4. Slurm任务调度系统部署和测试(源码)(1)

    1. 概述1.1 节点信息2. 节点准备3. 部署NTP服务器4. 部署LDAP服务器5. 部署Munge认证服务6. 部署Mysql数据库服务7. 部署slurm7.1 创建slurm用户7.2 挂 ...

  5. Houdini toolset environment variable setting

    Game Development Toolset HOUDINI_PATH = "C:\Users\fooldrifter\Documents\houdini17.5\GameDevelop ...

  6. Centos下SFTP双机高可用环境部署记录

    SFTP(SSH File Transfer Protocol),安全文件传送协议.有时也被称作 Secure File Transfer Protocol 或 SFTP.它和SCP的区别是它允许用户 ...

  7. react/React Native 在 import 导入时,有的带花括号{},有的不带原理解析

    在使用import引用模块时,如何正确使用{} 例如:有两个文件,home.js.user.js 一:不使用{}: 当需要在home.js中引入user.js的时候 //home.js 文件中impo ...

  8. 使用msysgit上传项目到github

    综合这几个教程,终于提价了项目,总结一下流程. (教程1[github入门教程]:http://jingpin.jikexueyuan.com/article/1037.html) (教程2[常见错误 ...

  9. CSS里Postion几个取值relative、absolute、static、fixed的区别和用法

    ---恢复内容开始--- static:静态定位,也是postion的默认值,没有定位,元素出现在正常的流中,忽略top\bottom\left\right或者z-index声明. relative: ...

  10. SpringBoot初识

    作用 SpringBoot是为了简化Spring应用的创建.运行.调试.部署等等而出现的,使用它可以专注业务开发,不需要太多的xml的配置. 核心功能 1.内嵌Servlet容器(tomcat.jet ...