2017校招真题在线编程 异或
来源:互联网 发布:ubuntu谷歌拼音输入法 编辑:程序博客网 时间:2024/06/07 05:15
思路:
将每个数字造成字典树的一条链。每次查询时,如果当前位置上m是0,那么必定可以取a[i]的相反值。
如果m在这个位置上是1,那就必须取与a[i]在当前位置上的相反值
#include <stdio.h>#include <algorithm>#include <cstring>#include <bitset>using namespace std;const int N=33;struct node{ node *nxt[2]; int val,num; node() { val=num=0; fill(nxt,nxt+2,nullptr); }};node *root;int n,m;void update(int k){ bitset<N> bit=k; int kk; node *cur=root; root->val=0; for (int i=17; i>=0; --i) { kk=bit[i]; if( cur->nxt[kk]==NULL) { node *tmp=new node(); cur->nxt[kk]=tmp; } cur=cur->nxt[kk]; cur->num++; }} long long query(node *t,int k ){ long long ans=0; bitset<N> bitm=m; bitset<N> bitn=k; for(int i=17;i>=0&&t!=NULL;--i) { int nm=bitm[i]; int nn=bitn[i]; if(nm==0){ if(t->nxt[nn^1]!=NULL) ans+=t->nxt[nn^1]->num; t=t->nxt[nn]; } else t=t->nxt[nn^1]; } return ans;}int a[100005];int main(){ int T,val,s; root =new node(); scanf("%d%d",&n,&m); for (int i=0; i<n; ++i) { scanf("%d",&a[i]); update(a[i]); } long long ans=0; for (int i=0; i<n; ++i) { ans+=query(root,a[i] ); } printf("%lld\n",ans/2); return 0;}/*2 14 2*/
阅读全文
0 0
- 2017校招真题在线编程 异或
- 2017校招真题在线编程
- 一些在线编程练习或调试网站
- [编程题] 异或
- 【编程】【2017京东java实习生编程题】异或
- 2016校招真题在线编程 懂二进制
- 庞果网-在线编程 我们曾经或即将经历的招聘会
- JAVA常用API或编程工具003--实现pdf在线阅读功能之pdf.js
- 滴滴2017校园招聘在线编程题
- 2017阿里巴巴实习在线编程测验Java
- 2017阿里前端内推在线编程
- 2017阿里实习生在线编程题
- 2017实习生在线测评编程题
- 2017阿里秋招内推在线编程题解法
- 2017腾讯校招在线编程----编码
- 科大讯飞 2017在线笔试编程题
- 2017年小红书在线笔试编程第一题
- 2017年小红书在线笔试编程第二题
- 剑指offer——53.表示数值的字符串
- 1).单例模式的七种写法
- C语言 删除多个相同元素
- Python字符串和编码
- css3 :nth-child和:nth-of-type的区别
- 2017校招真题在线编程 异或
- 第三周 项目4-顺序表应用 (2)
- Doctype作用?严格模式与混杂模式如何区分?它们有何差异?
- 游戏BI数据统计分析相关
- Python自动化(六)使用xlwt操作Excel
- 《C编码实践篇》实验二——命令行菜单小程序的实现
- 全景图像展开
- mongodb 添加用户名密码验证
- 第三周项目3求集合并集