HDU3949 XOR (线性基)
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 (线性基)的更多相关文章
- [hdu3949]XOR(线性基求xor第k小)
题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- HDU3949 XOR(线性基第k小)
Problem Description XOR is a kind of bit operator, we define that as follow: for two binary base num ...
- Xor && 线性基练习
#include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...
- 【BZOJ-2115】Xor 线性基 + DFS
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2142 Solved: 893[Submit][Status] ...
- BZOJ.2115.[WC2011]Xor(线性基)
题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...
- BZOJ2115:[WC2011] Xor(线性基)
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- 2019牛客多校第一场H XOR 线性基模板
H XOR 题意 给出一组数,求所有满足异或和为0的子集的长度和 分析 n为1e5,所以枚举子集肯定是不可行的,这种时候我们通常要转化成求每一个数的贡献,对于一组数异或和为0.我们考虑使用线性基,对这 ...
- BZOJ 2115 [Wc2011] Xor ——线性基
[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...
- BZOJ 2844: albus就是要第一个出场 [高斯消元XOR 线性基]
2844: albus就是要第一个出场 题意:给定一个n个数的集合S和一个数x,求x在S的$2^n$个子集从小到大的异或和序列中最早出现的位置 一开始看错题了...人家要求的是x第一次出现位置不是第x ...
随机推荐
- 小程序解析html和富文本编辑内容【亲测有效】
首先去 https://github.com/icindy/wxParse 下载wxParse,只拷贝wxParse文件夹即可. 1.引入wxss @import "../../util/w ...
- Apache POI:Excel读写库
1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...
- [Clr via C#读书笔记]Cp19可空值类型
Cp19可空值类型 主要解决的是和数据库中null对应的问题: System.Nullable结构:值类型: int?语法: 可空实例能够使用操作符: C#空合并操作符??; 即可用于引用类型,也可以 ...
- java并发总览
- Python replace方法并不改变原字符串
直接给出结论:replace方法不会改变原字符串. temp_str = 'this is a test' print(temp_str.replace('is','IS') print(temp_s ...
- 【机器学习】线性回归sklearn实现
线性回归原理介绍 线性回归python实现 线性回归sklearn实现 这里使用sklearn框架实现线性回归.使用框架更方便,可以少写很多代码. 写了三个例子,分别是单变量的.双变量的和多变量的.单 ...
- 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧
由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识.课程分为5个部分(粗体部分为已经看过的): 神经网络和深度学习 改善深层神经网络:超参数调试.正则化以及优化 ...
- 统计学习五:3.决策树的学习之CART算法
全文引用自<统计学习方法>(李航) 分类与回归树(classification and regression tree, CART)模型是由Breiman等人于1984年提出的另一类决策树 ...
- POJ 1679 The Unique MST(最小生成树)
Description Given a connected undirected graph, tell if its minimum spanning tree is unique. Definit ...
- JS设置cookie,删除cookie(引)
JS设置cookie,删除cookie(引) js设置cookie有很多种方法. 第一种:(这个是w3c官网的代码) <script> //设置cookie function setCoo ...