传送门

不知道线性基是什么东西的可以看看蒟蒻的总结

题目大意:求一堆数字能异或出的第$k$大的数是多少

线性基求第k大好珂怕……

据大佬们说就是把$k$给二进制拆分,如果$k$的第$i$位为1,那么$ans^=b[i]$

然后就是注意矩阵得消成对角矩阵而不是上三角矩阵……

这样的话$1$只会出现在对角线上

记$cnt$为对角线上有多少个$1$

显然能获得的异或值总共有$1<<cnt$个(包括0)

然后注意,如果$cnt!=n$,那么这一堆数字就是线性相关的,可以异或出0

否则的话说明这一堆数字线性无关,无法异或出0,那么得把$k++$(因为我们这里的$k$是默认能取到0的)

然后剩下的细节看代码好了

 //minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline ll read(){
#define num ch-'0'
char ch;bool flag=;ll res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=1e5+;
int n,m,k;ll a[N],b[];
void init(){
for(int i=;i<=n;++i)
for(int j=;j>=;--j){
if(a[i]>>j&){
if(b[j]) a[i]^=b[j];
else{
b[j]=a[i];
for(int k=j-;k>=;--k)
if(b[k]&&(b[j]>>k&)) b[j]^=b[k];
for(int k=j+;k<=;++k)
if(b[k]>>j&) b[k]^=b[j];
break;
}
}
}
}
int main(){
// freopen("testdata.in","r",stdin);
int T=read();
for(int cas=;cas<=T;++cas){
memset(b,,sizeof(b));n=read();
for(int i=;i<=n;++i) a[i]=read();
init();
int cnt=;
for(int i=;i<=;++i)
if(b[i]) ++cnt;
m=read();
printf("Case #%d:\n",cas);
while(m--){
ll x=read();
if(cnt==n) ++x;
if(x>(1ll<<cnt)){puts("-1");continue;}
ll ans=;
int tmp=cnt;
for(int i=;i>=;--i){
if(b[i]){
ll now=(1ll<<(tmp-));
if(x>now) x-=now,ans^=b[i];
--tmp;
}
}
printf("%lld\n",ans);
}
}
return ;
}

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

  1. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

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

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

  3. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  4. BZOJ 2460 [BeiJing2011]元素 ——线性基

    [题目分析] 线性基,由于最多有63个,只需要排序之后,动态的去维护线性基即可. [代码] #include <cstdio> #include <cstring> #incl ...

  5. Xor && 线性基练习

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

  6. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 238  Solved: 113[Submit][Status ...

  7. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

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

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

  9. 【BZOJ-4269】再见Xor 高斯消元 + 线性基

    4269: 再见Xor Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 131  Solved: 81[Submit][Status][Discuss] ...

随机推荐

  1. ajax跨域请求的问题

    使用getJson跨域请求,需要向服务器发送一个参数callback=? $.getJSON("http://appcenter.mobitide.com/admin/appSearch.p ...

  2. Ahead-of-time compilation

    https://en.wikipedia.org/wiki/Ahead-of-time_compilation

  3. leetcode 790. Domino and Tromino Tiling

    We have two types of tiles: a 2x1 domino shape, and an "L" tromino shape. These shapes may ...

  4. Android系统编译错误Note: Some input files use or override a deprecated API. 解决办法【转】

    本文转载自:http://blog.csdn.net/lilidejing/article/details/46564491 进入系统framework层修改了下MediaPlayer.java的源码 ...

  5. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

  6. Codeforces Round #376 (Div. 2) F. Video Cards —— 前缀和 & 后缀和

    题目链接:http://codeforces.com/contest/731/problem/F F. Video Cards time limit per test 1 second memory ...

  7. 简单快捷地测试 JPush API

    随着 JPush API v3版本的推出,加上之前开放的 Report API,JPush API 逐渐切换为比较好的符合 REST API 的规范,从而也很容易地使用一般的 HTTP/REST 工具 ...

  8. AutoIt:AutoIt比我想象的更加强大

    前段时间,我一直认为,通过AutoIt进行自动化操作,也只有几个方法可以用,它们只是controlClick, controlsend等如下图: 我一直认为,AutoIt的所有的GUI 方法,都是用来 ...

  9. MongoDB复制集成员及架构介绍(一)

    MongoDB复制集介绍 MongoDB支持在多个机器中通过异步复制达到提供了冗余,增加了数据的可用性.MongoDB有两种类型的复制,第一种是同于MySQL的主从复制模式(MongoDB已不再推荐此 ...

  10. C++日志之获取函数的名字,行号,文件名

    在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名.行号.函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__ 先介绍几个编译器内置的宏定 ...