-
Xor Sum
- HDU - 4825
- 题意:给定一个数组 长度为 n,然后 给出m次询问 每次输出 与 询问的数 异或值最大的结果
- 思路:0 1 字典树 存储 原数组中的数,每次查询,贪心的选取 首先选取 当前位上相反的数,
- 没有则取相同
-
#include<bits/stdc++.h> using namespace std; #define maxn 112345 int tree[maxn*32][3],t; int sum[maxn*32],id,n,m,x; void updata(int x) { int p=0; for(int i=31; i>=0; i--) { int c=(((1<<i)&x)?1:0); if(!tree[p][c]) { tree[p][c]=++id; tree[id][0]=tree[id][1]=0; } p=tree[p][c]; } } int fond(int x) { int ret=0,p=0; for(int i=31; i>=0; i--) { int c=(((1<<i)&x)?1:0); if(tree[p][!c]) { ret|=(!c)?(1<<i):0; p=tree[p][!c]; } else { ret|=(c?(1<<i):0); p=tree[p][c]; } } return ret; } int main() { scanf("%d",&t); for(int qq=1; qq<=t; qq++) { id=tree[0][0]=tree[0][1]=0; scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%d",&x); updata(x); } printf("Case #%d:\n",qq); while(m--) { scanf("%d",&x); printf("%d\n",fond(x)); } } return 0; }
Xor Sum HDU - 4825 -01字典树
最新推荐文章于 2021-07-21 15:24:20 发布