[hdu3949]XOR(线性基求xor第k小)

题目大意:求xor所有值的第k小,线性基模板题。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int MAX_BASE=63;
ll base[64],a[10006],n,m;
//构造线性基,也可用来判断x是否存在,最后返回是否等于0即可。
void getbase(){
  memset(base,0,sizeof base);
  for(int i=1;i<=n;i++){
      for(int j=MAX_BASE;j>=0;j--){
          if(a[i]>>j){
              if(!base[j]){
                base[j]=a[i];
                break;
              }
              a[i]^=base[j];
          }
      }
  }
}
//从高位到低位扫描线性基。如果异或之后答案变大,就把这一位异或到答案。
ll query_max(){
  ll ans=0;
  for(int i=MAX_BASE;i>=0;i--){
      if((base[i]^ans)>ans){
          ans=base[i]^ans;
      }
  }
  return ans;
}
//从低位到高位扫描线性基。最低位上的线性基即为答案。
ll query_min(){
  for(int i=0;i<=MAX_BASE;i++)
      if(base[i]>0) return a[i];
}
ll cnt,p[64];
//注意0的特殊情况,判断if(n!=cnt)k--;
void rebuild(){
  cnt=0;
  for(int i=MAX_BASE;i>=0;i--){
    if(!base[i]) continue;
    for(int j=i-1;j>=0;j--)//还是倒序,一定
      if((base[i]>>j)&1)
        base[i]^=base[j];
  }
  for(int i=0;i<=MAX_BASE;i++)
    if(base[i])
      p[cnt++]=base[i];
}
ll query_k_max(ll k){
  ll ans=0;
  if(k>=(1ll<<cnt)) return -1;
  for(int i=MAX_BASE;i>=0;i--){
    if((k>>i)&1)
      ans^=p[i];
  }
  return ans;
}

int main(){
  int t,tmp;
  scanf("%d",&t);
  for(int _=1;_<=t;_++){
    printf("Case #%d:\n",_);
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    getbase();
    rebuild();
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
      scanf("%d",&tmp);
      if(n!=cnt) tmp--;
      ll ans=query_k_max(tmp);
      printf("%lld\n",ans);
    }
  }
  return 0;
}

原文地址:https://www.cnblogs.com/elpsycongroo/p/10358569.html

时间: 2024-10-25 15:50:49

[hdu3949]XOR(线性基求xor第k小)的相关文章

hdu3949(线性基,求第k小的异或和

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 XOR Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4731    Accepted Submission(s): 1658 Problem Description XOR is a kind of bit operator, we

【HDU3949】XOR 线性基

#include <stdio.h> int main() { puts("转载请注明出处谢谢"); puts("http://blog.csdn.net/vmurder/article/details/43448493"); } 题意:给若干个数让你异或,然后询问第k大的异或和. 题解: 先搞出来线性基,然后第k大的异或和就是: 把k二进制拆分,第i位上有1,就把第i个线性基异或进来. 原因: 因为线性基是一堆高位上的1(或许有一些位动不了),然后把这

hdu 3949 XOR (线性基)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意: 给出n个数,从中任意取几个数字异或,求第k小的异或和 思路: 线性基求第k小异或和,因为题目中可以出现异或和为0的情况,但线性基里是不会出现异或和为0的情况,所以我们需要多处理下,将数字全插入到线性基中,如果无法插入也就代表会出现异或和为0的情况,那么求第k小就应该变成求线性基中第k-1小. 实现代码: #include<bits/stdc++.h> using namespace s

【模板】线性基求交

线性基求交 struct lb{ ll p[63]; lb(){ memset(p,0,sizeof(p)); } void clear(){ memset(p,0,sizeof(p)); } void ins(ll x){ for(int i=60;i>=0;i--) if((x>>i)&1){ if(!p[i]){ p[i]=x; return; }else x^=p[i]; } } }; lb merge(lb a,lb b){ lb g=lb(),tmp=a; ll cu

poj 2104主席树求区间第k小

POJ - 2104 题意:求区间第k小 思路:无修改主席树 AC代码: #include "iostream" #include "iomanip" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set&

主席树|求区间第k小模板

主席树 学了主席树,用来求区间上的第k小 写一下自己整理后的模板 求区间第k小 #include<bits/stdc++.h> using namespace std; //求区间第k小 const int maxn = 500010; struct node{ int v,lc,rc; }T[maxn * 21]; int n,m; int root[maxn]; int e; void insert(int pre,int cur,int pos,int l,int r){ if(l ==

HDU3949 XOR(线性基第k小)

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,

BZOJ 2115: [Wc2011] Xor 线性基

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 解法: 膜:http://www.cnblogs.com/ljh2000-jump/p/5869925.html 这道题要求从1到n的最大xor和路径,存在重边,允许经过重复点.重复边.那么在图上作图尝试之后就会发现,路径一定是由许多的环和一条从1到n的路径组成.容易发现,来回走是没有任何意义的,因为来回走意味着抵消.考虑这道题求得是路径xor和最大,所以必然我们要想办法处理环的情

【BZOJ-2115】Xor 线性基 + DFS

2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 2142  Solved: 893[Submit][Status][Discuss] Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边. 图中可能有重边或自环. Output 仅包含一个整数,表示最大