HDU3949:XOR——题解
2024-09-30 15:56:24
http://acm.hdu.edu.cn/showproblem.php?pid=3949
求n个数的异或和第k小。
参考:https://blog.sengxian.com/algorithms/linear-basis
没了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int BASE=;
ll b[];
int n,cnt;
vector<ll>mp;
ll query(ll k){
if(cnt!=n)k--;
if(k>(1LL<<(int)mp.size())-)return -;
ll ans=;
for(int i=;i<(int)mp.size();i++){
if(k>>i&)ans^=mp[i];
}
return ans;
}
inline void init(){
cnt=;
memset(b,,sizeof(b));
mp.clear();
}
int main(){
int t;
scanf("%d",&t);
for(int cas=;cas<=t;cas++){
printf("Case #%d:\n",cas);
scanf("%d",&n);
init();
for(int i=;i<=n;i++){
ll a;scanf("%lld",&a);
for(int j=BASE;j>=;j--){
if(a>>j&){
if(b[j])a^=b[j];
else{
b[j]=a;cnt++;
for(int k=j-;k>=;k--)
if(b[k]&&(b[j]>>k&))b[j]^=b[k];
for(int k=j+;k<=BASE;k++)
if(b[k]>>j&)b[k]^=b[j];
break;
}
}
}
}
for(int i=;i<=BASE;i++)
if(b[i])mp.push_back(b[i]);
int q;
scanf("%d",&q);
while(q--){
ll k;
scanf("%lld",&k);
printf("%lld\n",query(k));
}
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
最新文章
- People Tools catalog tables.
- Tomcat启动时项目重复加载,导致资源初始化两次的问题
- C#通过安全证书生成签名和验签辅助类
- fast-framework – 基于 JDK 8 实现的 Java Web MVC 框架
- Laravel5.1控制器小结
- Sql CLR
- VS2012格式化插件配置备份
- JNI(2)
- 背包问题matlab程序
- Openlayers 3 图层探查功能
- 【模板】Tarjan求强连通分量
- burpsuite截断上传webshell
- P1577 切绳子
- SQLServer 2008 R2查看字段约束
- tensorflow-softmax
- Python开发【笔记】:什么是RESTful框架
- c++——默认参数、函数占位参数
- 恢复二进制文件中的block符号表
- Error creating bean with name &#39;adminUserController&#39;: Injection of autowired dependencies failed;
- easyUI datagrid 排序