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. 【转载】2015Android 面试题 01

    1.如何避免ANR? 答:ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应. 当出现下列情况时,Andr ...

  2. 各类4G手机进入工参模式查看手机信息

    随着移动4G正式商用,LTE网络建设日益完善,LTE用户日趋增多,通过进入其工程模式读取服务小区电平RSRP.物理小区标识PCI和频点号等基本信息的方式来判断测试点信号质量的优劣.由于市场上商用终端品 ...

  3. Python-期末练习

    1.骑车与走路:我们的校园很大很大很大大大大大……,骑个自行车去办事会很快,比如取个快递了,到其他宿舍楼找个同(nv)学(you)了.但实际上,并非去办任何事情都是骑车快,因为骑车总要找车.开锁.停车 ...

  4. Python 服务器端表单验证插件

    Python格式验证库 Cerberus 作者 MrStranger 关注 2016.08.02 14:44 字数 2140 阅读 79评论 0喜欢 1 Cerberus是一个验证Python对象.M ...

  5. Java package和import语句

    Java中的package和import语句 如果你想让其他人访问你的类,你一定要把你写的类放到正确的子目录下. 在Java里,对于位于包中的类是这样管理的: Java编译器把包对应于文件系统的目录管 ...

  6. PAT1024 强行用链表写了一发。

    主要的思想还是 上课的那个PPT上面的 链表反转的思想. 然后加一点七七八八的 递推. 一层一层往下翻转就好啦. 1A 真开心. 代码:http://paste.ubuntu.net/16506799 ...

  7. jsp连接MYSQL数据库教程(文字+图)

    步骤: 1.在mysql官网下载JDBC驱动程序.网址:https://dev.mysql.com/downloads/connector/j/ 2.把里面的jar包(mysql-connector- ...

  8. 【Linux】- Ubutnu UFW防火墙的简单设置

    ufw是一个主机端的iptables类防火墙配置工具,比较容易上手.一般桌面应用使用ufw已经可以满足要求了. 安装方法 sudo apt-get install ufw 使用方法 1.启用: sud ...

  9. 探讨C++实现一个不可被继承的类

    C#和Java都提供了一种机制让一个类不能被继承,如C#中的sealed关键字和Java的final关键字,然而C++程序员就没这么好命了.不过C++也可以模拟出这种效果,原理基于:子类的构造函数会自 ...

  10. 累积下学习 C#时和 Java时的不同点

    ==和equals()方法的区别: 首先有一个观点: 这两个都是用来比较值是否相等的 ( 这里的值有时候指的是地址值, 有时候是存储的值; 下面将地址值称为地址, 存储的值称为值 ) 在Java中: ...