CSU 1216 异或最大值
2014-09-09 16:52
393 查看
求n个数里面,求两两异或的最大值
直接来肯定会超时
既然要异或最大值,那么两个数的二进制肯定是正好错开为好、、、为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面找离他最远的即可。
直接来肯定会超时
既然要异或最大值,那么两个数的二进制肯定是正好错开为好、、、为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面找离他最远的即可。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n; int A[100010]; int ch[20*100010][2],cnt; int val[20*100010]; void inserts(int x) { int rt=0; for (int i=30;i>=0;i--){ bool k=((1<<i)&x); if (ch[rt][k]==-1){ ch[rt][k]=cnt++; } rt=ch[rt][k]; } val[rt]=x; } int query(int x) { int rt=0; for (int i=30;i>=0;i--){ bool k=((1<<i)&x); if (ch[rt][!k]!=-1){ rt=ch[rt][!k]; } else rt=ch[rt][k]; } //cout<<val[rt]<<endl; return x^val[rt]; } int main() { //int test=(1<<2)&3; //cout<<test<<endl; while (scanf("%d",&n)!=EOF) { cnt=1; memset(ch,-1,sizeof ch); for (int i=0;i<n;i++){ scanf("%d",&A[i]); inserts(A[i]); } int ans=0; for (int i=0;i<n;i++){ int res=query(A[i]); ans=max(ans,res); } printf("%d\n",ans); } return 0; }
相关文章推荐
- csu-1216: 异或最大值
- CSUOJ 1216 异或最大值 (01Trie)
- CSU_1216(异或最大值)
- CSU 1216 异或最大值【字典树】
- CSU 1216 异或最大值(01Trie)
- CSU 1216 异或最大值
- CSU 1216 异或最大值 01trie
- CSU-1216: 异或最大值-trie-01字典树
- CSU_1216【异或最大值】
- CSU 1216: 异或最大值(字典树+贪心)
- ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)
- CSU 1216 —— 异或最大值
- CSU 1214 找最大异或值
- COJ 1216: 异或最大值(01字典树)
- COJ 1216 异或最大值
- COJ-1216 异或最大值
- COJ 1216 最大异或值
- 中南大学COJ 1216: 异或最大值(数据结构)
- COJ 1216 异或最大值
- POJ 3764 The xor-longest Path 字典树求最大异或