HDU3949 XOR(线性基第k小)
Problem Description
Input
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
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
1 2
4
1 2 3 4
3
1 2 3
5
1 2 3 4 5
Sample Output
1
2
3
-1
Case #2:
0
1
2
3
-1
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.
Source
题目大意:给出$n$个数,问两两异或后第$k$小的数是多少
看了很多篇博客,发现都是在围绕着高斯消元解xor方程组来的。
然后我惊讶的发现,原来高斯消元解xor解方程组其实就是求出线性基然后再消元
通过消元保证线性基内有元素的每一列只有一个$1$
然后把$k$二进制分解,如果第$i$是$1$就异或上第$i$个有解的线性基
同时要特判$0$的情况,若线性基的大小与元素的大小相同则不能异或为$0$(线性无关),否则可以异或为零,这时我们只要求出第$k-1$小就可以了
这里把$k$二进制分解后的$0/1$实际对应了线性基中元素选/不选,可以证明这样一定是对的
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 1e5 + , B = ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int P[MAXN];
void Insert(int x) {
for(int i = B; i >= ; i--) {
if((x >> i) & ) {
if(P[i]) x = x ^ P[i];
else {P[i] = x; return ;}
}
}
}
void Debug(int *a, int N) {
for(int i = ; i <= N; i++) {
for(int j = ; j <= B; j++)
printf("%d ", (P[i] >> j) & );
puts("");
}
puts("********");
}
main() {
int QwQ = read();
for(int test = ; test <= QwQ; test++) {
printf("Case #%I64d:\n", test);
memset(P, , sizeof(P));
int N = read();
for(int i = ; i <= N; i++)
Insert(read());
for(int i = B; i >= ; i--) {
if(P[i]) {
for(int j = i + ; j <= B; j++)
if((P[j] >> i) & ) P[j] ^= P[i];
}
}
int now = ;
for(int i = ; i <= B; i++)
if(P[i])
P[now++] = P[i];
int Q = read();
while(Q--) {
int K = read(), ans = ;
if(now != N) K--;
if(K >= (1ll << now)) {puts("-1"); continue;}
for(int i = ; i <= B; i++)
if((K >> i) & )
ans ^= P[i];
printf("%I64d\n", ans);
}
}
}
HDU3949 XOR(线性基第k小)的更多相关文章
- hdu 3949 XOR 线性基 第k小异或和
题目链接 题意 给定\(n\)个数,对其每一个子集计算异或和,求第\(k\)小的异或和. 思路 先求得线性基. 同上题,转化为求其线性基的子集的第k小异或和. 结论 记\(n\)个数的线性基为向量组\ ...
- HDU3949 XOR (线性基)
HDU3949 XOR Problem Description XOR is a kind of bit operator, we define that as follow: for two bin ...
- [hdu3949]XOR(线性基求xor第k小)
题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- HDU 3949 XOR (线性基第k小)题解
题意: 给出\(n\)个数,求出子集异或第\(k\)小的值,不存在输出-1. 思路: 先用线性基存所有的子集,然后对线性基每一位进行消元,保证只有\(d[i]\)的\(i\)位存在1,那么这样变成了一 ...
- Xor && 线性基练习
#include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...
- HDU 3949 XOR [高斯消元XOR 线性基]
3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选 ...
- hdu 3949 XOR (线性基)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题 ...
- BZOJ4269:再见Xor(线性基)
Description 给定N个数,你可以在这些数中任意选一些数出来,每个数可以选任意多次,试求出你能选出的数的异或和的最大值和严格次大值. Input 第一行一个正整数N. 接下来一行N个非负整数. ...
- HDU 3949 XOR 线性基
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不 ...
随机推荐
- java nio--采用Selector实现Socket通信
server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...
- BNUOJ 14381 Wavio Sequence
Wavio Sequence Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVA. Origina ...
- jquery ajax获取json并解析,获取的json是object对象格式
首先我们使用的是ajax方式,推荐一个学习网址: http://blog.csdn.net/shiyaru1314/article/details/51065410 这个博主写的特别好.现在来看我们的 ...
- RxJava如何结合观察者与链式处理
RxJava如何结合观察者与链式处理 Author: Dorae Date: 2018年12月3日17:10:31 转载请注明出处 一.概述 首先问自己几个问题,如果非常清楚这几个问题的目的与答案,那 ...
- kendo Cannot read property 'call' of undefined
造成这个错误的原因是在 必须有id的定义
- 多Tabs的横向滚动插件(支持Zepto和jQuery)
一. 效果图 二. 功能介绍 1. 支持横向移动 2. 支持点击Tab后该Tab居中 3. 拉到最左边和最右边后依然可以拉动,只是tabs的移动距离变小. 三. 使用说明 1. 在你的html中添加T ...
- xcode执行后没看到输出的解决的方法
今天刚在虚拟机中的mac苹果里安装xcode.然后開始看Objective-C. 安装完后由于有默认的代码输出Hello world! ,所以就尝试执行了一发: 可惜没看到输出在哪,尼玛.还以为刚開始 ...
- oc81--copy内存管理
// // main.m // Copy内存管理(MRC才有内存管理) // #import <Foundation/Foundation.h> int main(int argc, co ...
- 我的Android进阶之旅------>Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.【转】
本文转载自:http://blog.csdn.net/ouyang_peng/article/details/48048975 今天在调用MediaRecorder.stop(),报错了,java.l ...
- 如何的退出无响应的 SSH 连接
~. 具体操作是Shift+-,然后松开按.. tips如果无效,可以先按下Enter,然后进行上面的操作.