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. python中为什么 if/while/def/class语句需要冒号?

    python中冒号主要用于增强可读性(ABC语言实验的结果之一).考虑一下这个: if a == b print(a) 与 if a == b: print(a) 注意第二种方法稍微容易一些.请进一步 ...

  2. Docker 镜像构建的时候,应该小心的坑

    不要改文件 如果run了以后,你还需要进入到容器中,修改容器的配置,那么,这个容器是危险的.一旦容器无法启动,就再也改不了配置.那么你就需要删除和重新run这个容器,而配置要再改一遍.一个可用的镜像在 ...

  3. c# html 导出word

    [CustomAuthorize]        public FileResult ExportQuestionCenterWord(SearchBaseQuestion search)       ...

  4. redis 编译安装错误问题

    编译redis安装的时候报错如下: make[1]: [persist-settings] Error 2 (ignored) CC adlist.o/bin/sh: cc: command not ...

  5. 迭代器类型:iterator & const_iterator

    vector<int> ivec{1, 3, 4, 1, 3, 4}; vector<int>::iterator iter; // iter能读写vector<int& ...

  6. Python学习之路5 - 函数

    函数 定义方式: def func(): "这里面写函数的描述" 这里写代码 return x #如果没有返回值就叫"过程",函数和过程的区别就是有无返回值 实 ...

  7. Notes of the scrum meeting before publishing2(12.18)

    meeting time:18:30~20:30p.m.,December 18th,2013 meeting place:3号公寓一层 attendees: 顾育豪                  ...

  8. c# throw抛出上一个异常

    catch(exception e) { throw; } 不仅抛出这次的异常,也抛出之前的异常. 用法示例:函数A调用函数B,A用到此throw时,B中发生的异常也会继承过来. catch(exce ...

  9. PCA算法理解及代码实现

    github:PCA代码实现.PCA应用 本文算法均使用python3实现 1. 数据降维   在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大, ...

  10. 《学习OpenCV》课后习题解答3

    题目:(P104) 创建一个大小为100*100的三通道RGB图像.将它的元素全部置0.使用指针算法以(20,5)与(40,20)为项点绘制一个绿色平面. 解答: #include "cv. ...