博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3949 XOR [高斯消元XOR 线性基]
阅读量:5089 次
发布时间:2019-06-13

本文共 1340 字,大约阅读时间需要 4 分钟。


题意:

给你 N个数,从中取出若干个进行异或运算 , 求最

后所有可以得到的异或结果中的第k小值


N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选,所以$2^r -1$)

然后如果$k \ge 2^r$就不存在啦

否则一定可以有$k$小,因为现在$1..r$行每行都有一位是1(左面是最高位)

从高到低枚举k的二进制,如果是1就异或上对应的行就行了,最后就是k小值啦

#include 
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N=1e4+5,INF=1e9;inline ll read(){ char c=getchar();ll x=0,f=1; while(c<'0'||c>'9'){ if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f;}int n,Q;ll a[N],k,bin[N];void ini(){ bin[0]=1;for(int i=1;i<=60;i++) bin[i]=bin[i-1]<<1;} int now;void Gauss(){ now=1; for(int i=60;i>=0;i--){ int j=now; while(j<=n&&!(a[j]&bin[i])) j++; if(j==n+1) continue; if(j!=now) swap(a[j],a[now]); for(int k=1;k<=n;k++) if(k!=now&&(a[k]&bin[i])) a[k]^=a[now]; now++; } now--;}ll Query(ll k){ //printf("Q %lld\n",k); ll ans=0; if(now!=n) k--; if(k>=bin[now]) return -1; for(int i=1;i<=now;i++) if(k&bin[now-i]) ans^=a[i]; return ans;}int main(){ freopen("in","r",stdin); ini(); int T=read(),cas=0; while(T--){printf("Case #%d:\n",++cas); n=read(); for(int i=1;i<=n;i++) a[i]=read(); Gauss(); Q=read(); while(Q--) printf("%lld\n",Query(read())); }}

 

转载于:https://www.cnblogs.com/candy99/p/6414769.html

你可能感兴趣的文章
day-12 python实现简单线性回归和多元线性回归算法
查看>>
Json格式的字符串转换为正常显示的日期格式
查看>>
[转]使用 Razor 进行递归操作
查看>>
[转]Android xxx is not translated in yyy, zzz 的解决方法
查看>>
docker入门
查看>>
Android系统--输入系统(十一)Reader线程_简单处理
查看>>
监督学习模型分类 生成模型vs判别模型 概率模型vs非概率模型 参数模型vs非参数模型...
查看>>
Mobiscroll脚本破解,去除Trial和注册时间限制【转】
查看>>
实验五 Java网络编程及安全
查看>>
32位与64位 兼容编程
查看>>
iframe父子页面通信
查看>>
ambari 大数据安装利器
查看>>
java 上传图片压缩图片
查看>>
magento 自定义订单前缀或订单起始编号
查看>>
ACM_拼接数字
查看>>
计算机基础作业1
查看>>
Ubuntu 深度炼丹环境配置
查看>>
C#中集合ArrayList与Hashtable的使用
查看>>
从一个标准 url 里取出文件的扩展名
查看>>
map基本用法
查看>>