COJ 1216: 异或最大值(01字典树)
2012-07-22 23:39
323 查看
题意:求n个非负数中任意2个的异或值的最大值。n数量级为10^5
分析:直接暴力肯定超时了。一个非负整数可以看成1个32位的01字符串,n个数可以看成n个字符串,因此可以建立字典树,建好树后,对于任意非负整数x,可以沿着树根往下贪心找到y,使得x异或y最大,复杂度为树的深度。
View Code
分析:直接暴力肯定超时了。一个非负整数可以看成1个32位的01字符串,n个数可以看成n个字符串,因此可以建立字典树,建好树后,对于任意非负整数x,可以沿着树根往下贪心找到y,使得x异或y最大,复杂度为树的深度。
View Code
#include <stdio.h> #include <string.h> #define MAX(a,b) ((a)>(b)?(a):(b)) #define NODE 3200010 #define N 100010 int n; int v ; int node; int next[NODE][2]; int end[NODE]; void add(int cur,int k) { memset(next[node],0,sizeof(next[node])); end[node]=0; next[cur][k]=node++; } int cal(int x) { int i,k,cur=0; for(i=30;i>=0;i--) { k=((1<<i)&x)?0:1; if(next[cur][k]) cur=next[cur][k]; else cur=next[cur][1-k]; } return (x^end[cur]); } int main() { int i,j,k,x,cur; int ans; while(~scanf("%d",&n)) { node=1; memset(next[0],0,sizeof(next[0])); for(i=0;i<n;i++) { scanf("%d",&x); v[i]=x; cur=0; for(j=30;j>=0;j--) { k=((1<<j)&x)?1:0; if(next[cur][k]==0) add(cur,k); cur=next[cur][k]; } end[cur]=x; } for(ans=i=0;i<n;i++) ans=MAX(ans,cal(v[i])); printf("%d\n",ans); } return 0; }
相关文章推荐
- CSU-1216: 异或最大值-trie-01字典树
- CSUOJ 1216 异或最大值 (01Trie)
- 异或最大值(01字典树)
- [01字典树]求序列完美度(求区间最大异或值)
- COJ-1216 异或最大值
- CSU 1216 异或最大值(01Trie)
- COJ 1216 异或最大值
- CSU 1216 异或最大值 01trie
- Chip Factory---hdu5536(异或值最大,01字典树)
- CSU 1216 异或最大值【字典树】
- 中南大学COJ 1216: 异或最大值(数据结构)
- COJ 1216 异或最大值
- HDU 5536 Chip Factory(01字典树找最大异或值)——2015ACM/ICPC亚洲区长春站
- HDU6059(01字典树求异或最大值)
- ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)
- hdu 4825 Xor Sum(01字典树求最大异或值)
- Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset(01字典树求最大异或值)
- 使用01字典树解决最大异或问题
- 【求两个数异或的最大值】01字典树求解
- CSU 1216: 异或最大值(字典树+贪心)