HDU3949 XOR

Problem Description

XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A XOR B, then for each bit of C, we can get its value by check the digit of corresponding position in A and B. And for each digit, 1 XOR 1 = 0, 1 XOR 0 = 1, 0 XOR 1 = 1, 0 XOR 0 = 0. And we simply write this operator as ^, like 3 ^ 1 = 2,4 ^ 3 = 7. XOR is an amazing operator and this is a question about XOR. We can choose several numbers and do XOR operatorion to them one by one, then we get another number. For example, if we choose 2,3 and 4, we can get 234=5. Now, you are given N numbers, and you can choose some of them(even a single number) to do XOR on them, and you can get many different numbers. Now I want you tell me which number is the K-th smallest number among them.

Input

First line of the input is a single integer T(T<=30), indicates there are T test cases.

For each test case, the first line is an integer N(1<=N<=10000), the number of numbers below. The second line contains N integers (each number is between 1 and 10^18). The third line is a number Q(1<=Q<=10000), the number of queries. The fourth line contains Q numbers(each number is between 1 and 10^18) K1,K2,......KQ.

Output

For each test case,first output Case #C: in a single line,C means the number of the test case which is from 1 to T. Then for each query, you should output a single line contains the Ki-th smallest number in them, if there are less than Ki different numbers, output -1.

Sample Input

2

2

1 2

4

1 2 3 4

3

1 2 3

5

1 2 3 4 5

Sample Output

Case #1:

1

2

3

-1

Case #2:

0

1

2

3

-1

Hint

If you choose a single number, the result you get is the number you choose.

Using long long instead of int because of the result may exceed 2^31-1.

Solution

简述一下题意:n个权值,m个询问,每次一个k,表示询问n个元素可以异或出来的所有值中的第k小值

线性基求k小值...

我们需要改进一下线性基,将每一位都独立,如果j<i,且p[i]的第j位是1,就把p[i]^p[j].这样,对于二进制的每一位i.只有p[i]这一位是1,其他的都是0。

我们查询的时候,将k进行二进制拆分,如果第i位是1,就异或上线性基中第i个元素(注意不是第i位,俄日是从小到大第i个),最终得出的答案就是k小值,怎么证?我也不会....

il void rebuild() {//重构函数
for(rg lol i=63;i>=0;i--)
for(rg lol j=i-1;j>=0;j--)
if(arr[i]>>j&1) arr[i]^=arr[j];
for(int i=0;i<=63;i++) if(arr[i]) arr[cnt++]=arr[i];
}

然后,要注意一个点,因为线性基的性质:线性基没有异或和为0的子集

所以默认的最小值是没有0的,但是如果有一个值插入失败了,说明这个值已经可以通过线性基里面的值异或出来,那么最小值肯定是0,所以们要把查询的k-1

Code

#include<bits/stdc++.h>
#define lol long long
#define il inline
#define rg register
using namespace std; void in(lol &ans) {
ans=0; lol f=1; char i=getchar();
while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar();
ans*=f;
} lol n,q,T,cnt,flag;
lol arr[65]; il void init(lol x) {
for(lol i=63;i>=0;i--) {
if((x>>i&1)==0) continue;
if(!arr[i]) {arr[i]=x;break;}
else x^=arr[i];
}if(!x) flag=1;//插入失败
} il void query(lol k,lol ans=0) {
if(k>>cnt) {puts("-1");return;}
for(rg lol i=0;i<cnt;i++) {
if(k>>i&1) ans^=arr[i];
}printf("%lld\n",ans);
} il void rebuild() {
for(rg lol i=63;i>=0;i--)
for(rg lol j=i-1;j>=0;j--)
if(arr[i]>>j&1) arr[i]^=arr[j];
for(int i=0;i<=63;i++) if(arr[i]) arr[cnt++]=arr[i];
} int main()
{
in(T);
for(int t=1;t<=T;t++) {
flag=0; printf("Case #%d:\n",t);
in(n);
for(lol i=1,x;i<=n;i++) in(x),init(x);
rebuild(); in(q);
for(lol i=1,x;i<=q;i++) {
in(x); if(flag) x--; query(x);//查询的k的范围-1
}
memset(arr,0,sizeof(arr)); cnt=0;
}return 0;
}

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

  1. [hdu3949]XOR(线性基求xor第k小)

    题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...

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

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

  3. Xor && 线性基练习

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

  4. 【BZOJ-2115】Xor 线性基 + DFS

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status] ...

  5. BZOJ.2115.[WC2011]Xor(线性基)

    题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...

  6. BZOJ2115:[WC2011] Xor(线性基)

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  7. 2019牛客多校第一场H XOR 线性基模板

    H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...

  8. BZOJ 2115 [Wc2011] Xor ——线性基

    [题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...

  9. BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]

    2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...

随机推荐

  1. 一段代码-Java

    在打算写这么一篇文章的时候,想到很多,觉得要是全都写下来的话,估计BZ也不知道要写多少,总之,好多吧!那么,就让BZ一切从简... 我们知道java它的特殊性在于,用它所写代码的运行是依靠自己的一套j ...

  2. [JSON].toXMLString()

    语法:[JSON].toXMLString() 返回:[String] 说明:将[JSON]实例转换成XML格式结果. 示例: <% jsonString = "{div: 'hell ...

  3. CsvHelper文档-1前言

    CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...

  4. 两种缓存淘汰算法LFU&LRU

    LRU全称是Least Recently Used,即最近最久未使用的意思. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...

  5. LeetCode - 167. Two Sum II - Input array is sorted - O(n) - ( C++ ) - 解题报告

    1.题目大意 Given an array of integers that is already sorted in ascending order, find two numbers such t ...

  6. 基础数据类型-tuple

    Python中,元组tuple与list类似,不同之处在于tuple的元素不能修改,tuple使用(),list使用[], (1)元组的创建使用(),需要注意的是创建包含一个元素的元组: tuple_ ...

  7. 《javascript模式--by Stoyan Stefanov》书摘--汇总

    <javascript模式--by Stoyan Stefanov>书摘--基本技巧 http://www.cnblogs.com/liubei/p/JavascriptModeLog1. ...

  8. DFS中的奇偶剪枝(技巧)

    剪枝是什么,简单的说就是把不可行的一些情况剪掉,例如走迷宫时运用回溯法,遇到死胡同时回溯,造成程序运行时间长.剪枝的概念,其实就跟走迷宫避开死胡同差不多.若我们把搜索的过程看成是对一棵树的遍历,那么剪 ...

  9. java — 排序算法

    1.冒泡排序 比较相邻元素,如果第一个比第二个大,就交换位置,每一次交换,当前 package BubbleSort; public class Test { public static void m ...

  10. Debian常用設置

    1. 更新軟件源 sudo cp /etc/apt/sources.list /etc/apt/sources.list_bak #備份 sudo vi /etc/apt/sources.list / ...