考虑当只有一个数出现奇数次的时候,我们可以很轻松的知道,把所有的数异或和即可,因为异或运算有一个非常有意思的性质,a^b^a=b

考虑当有两个数(a,b)出现奇数次的时候,我们异或和得到,num=a^b,那么怎么把这两个数分开呢?

我们想想,既然是位运算,一定和二进制有关,我们把num的二进制展开,我们发现一个问题,这个数的二进制为1的位置,一定是a或者b上的二进制异或留下,

那么我们可以知道,这位二进制位,要么a是1,要么b是1。

因此我们枚举这给的数的二进制位,看是否为1,如果为1,如果所有数的异或和在这一位二进制为1,代表对答案位置的二进制可能有贡献(也有可能被异或掉了),我们用cnt[i]代表这个二进制位,代表对i位的二进制影响。

cnt[i]:异或每一个对这一位有影响的数,他们的异或和只可能有三种张结果。要么是a,b中一个,要是sum(代表包括a,b在内的数对这一位是1都有贡献),或者是0。

我们再次枚举所有异或和的二进制,如果这一位为1,那么这一位的cnt[i],一定不可能同时存在a,b,但是也一定不可能没有a,b。所以这一位的cnt[i]保存的一定是a,b中的一个。

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#define LL long long
using namespace std;
LL cnt[];
LL n;
LL k;
LL sum=;
int main(){
while(~scanf("%lld%lld",&n,&k)){
LL tmp;
sum=;
for (int i=;i<n;i++){
scanf("%lld",&tmp);
for (int j=;j<;j++){
if((<<j)&tmp){
cnt[j]^=tmp;
}
}
sum^=tmp;
}
if (k==){
printf("%lld\n",sum);
continue;
}
LL a=;
for (int i=;i>;i--){
if((<<i)&sum){
a=sum^cnt[i];
break;
}
}
printf("%lld %lld\n",a,sum^a);
}
return ;
}

11076: 小P的集合 位运算的更多相关文章

  1. hihoCoder 1513 : 小Hi的烦恼 位运算好题

    思路:考虑第i个同学,第一门课排名比他靠前的同学的集合是S1,第二门课是S2...第五门课是S5,很明显比这个同学每门课程都优秀的同学就是S1&S2&S3&S4&S5, ...

  2. 你必须知道的基本位运算技巧(状压DP、搜索优化都会用到)

    一. 位操作基础 基本的位操作符有与.或.异或.取反.左移.右移这6种,它们的运算规则如下所示: 符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ...

  3. hdu3006 状态压缩+位运算+hash(小想法题)

    题意:        给了n个集合,问你这n个集合可以组合出多少种集合,可以自己,也可以两个,也可以三个....也可以n个集合组在一起. 思路:       是个小想法题目,要用到二进制压缩,位运算, ...

  4. 求集合中选一个数与当前值进行位运算的max

    求集合中选一个数与当前值进行位运算的max 这是一个听来的神仙东西. 先确定一下值域把,大概\(2^{16}\),再大点也可以,但是这里就只是写写,所以无所谓啦. 我们先看看如果暴力求怎么做,位运算需 ...

  5. c#位运算小例子笔记

    关于位运算,网上有挺多好的博客介绍过,我就不多解释了 这里只记录一个小例子,是在理解位运算时候写的,帮助自己加深一下印象,做个笔记mark一下 具体场景 摇骰子游戏 1每个骰子有6个点,1-3为小,4 ...

  6. c语言小技巧:C语言学习笔记之位运算求余

    我们都知道,求一个数被另一个数整除的余数,可以用求余运算符”%“,但是,如果不 允许使用求余运算符,又该怎么办呢?下面介绍一种方法,是通过位运算来求余,但是注 意:该方法只对除数是2的N次方幂时才有效 ...

  7. HDU 3006 The Number of set(位运算 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...

  8. 位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

  9. 【Java基础】14、位运算之——按位与(&)操作——(快速取模算法)

    学习redis 字典结构,hash找槽位 求槽位的索引值时,用到了 hash值 & sizemask操作, 其后的scan操作涉及扫描顺序逻辑,对同模的槽位 按一定规则扫描! 其中涉及位运算 ...

随机推荐

  1. [20181031]12c 在线移动数据文件.txt

    [20181031]12c 在线移动数据文件.txt --//12c以前,移动或者改名数据文件是一项比较麻烦的事情,至少要停一下业务.而12c支持在线移动或者改名数据文件,并且有点不可思议--//的是 ...

  2. c/c++ const关键字

    const 在星号的右边:不可以改指针的指向,可以用指针改里面的值 int * const p; const在星号的左边:可以改指针的指向,不可以用指针改里面的值 int const *p; cons ...

  3. vim 基础命令大全

         VIM命令大全 光标控制命令 命令                   光标移动h                   向左移一个字符j                   向下移一行k  ...

  4. web测试笔记

    WEB兼容性测试 一.客户端兼容性 1.浏览器的兼容性测试 a.内核角度 Tridnt内核:代表作IE.腾讯.遨游.世界之窗等 Gecko内核:代表作Firefox webkit内核:代表作Safar ...

  5. echo '1'.print(2)+3; 的输出结果为什么是511

    今天看到一道有趣的题目,如上所示.结果为什么会是511呢? 这个结果的计算分为三步来理解: 首先计算的是 右边print(2)+3,这个你可以直接理解成print(2+3),得到的结果是5.而prin ...

  6. LeetCode算法题-Palindrome Linked List(Java实现)

    这是悦乐书的第196次更新,第202篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第58题(顺位题号是234).给出一个单链表,确定它是否是回文.例如: 输入:1-> ...

  7. 【算法】LeetCode算法题-Merge Two Sorted List

    这是悦乐书的第148次更新,第150篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第7题(顺位题号是21).合并两个已排序的链表并将其作为新链表返回. 新链表应该通过拼接 ...

  8. cents上运行wget报错:unable to resolve host address

    wget命令报错.无法解析域名"www.keepalived.rog" [vagrant@RS1 download]$ wget http://www.keepalived.org ...

  9. Python:Day13

    id() 查看内存地址 和while循环一样,在for循环中也可以使用break和continue,两者效果一样. repr

  10. JSONPath介绍

    1. JSONPath介绍 官网地址: https://github.com/alibaba/fastjson/wiki/JSONPath fastjson 1.2.0之后的版本支持JSONPath. ...