CSU 1214 找最大异或值
2014-10-22 23:43
323 查看
题目大意:
给定一堆数,从中找2个数异或得到的最大值
直接暴力会超时,我们要考虑对于每一个数去匹配找到异或的最大值,我们希望2进制越前面的数尽可能都为1
所以我们用 0-1 字典树保存这些数,因为一个int型的正整数最多2进制到第30位,所以我们用31层高的字典树保存,第一层为root节点
每次查询操作都是对于当前数的2进制位查找,如果与之相反的方向有点,就往与之相反的方向向下找,这样异或才为1,没有,就顺着当前相同方向向下找,那样异或值为0
给定一堆数,从中找2个数异或得到的最大值
直接暴力会超时,我们要考虑对于每一个数去匹配找到异或的最大值,我们希望2进制越前面的数尽可能都为1
所以我们用 0-1 字典树保存这些数,因为一个int型的正整数最多2进制到第30位,所以我们用31层高的字典树保存,第一层为root节点
每次查询操作都是对于当前数的2进制位查找,如果与之相反的方向有点,就往与之相反的方向向下找,这样异或才为1,没有,就顺着当前相同方向向下找,那样异或值为0
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int ans; struct Node{ int num; Node *next[2]; Node(){ num = 0; next[0] = NULL; next[1] = NULL; } }; Node *root = new Node(); void add_node(int x) { int k = (x&(1<<30)) == 0?0:1; Node *q; if(!root->next[k]){ root->next[k] = new Node(); } q = root->next[k]; for(int i = 29 ; i >= 0 ; i--){ k = (x&(1<<i)) == 0?0:1; if(!q->next[k]) q->next[k] = new Node(); q = q->next[k]; } q->num = x; } void query(int x) { int k = (x&(1<<30)) == 0?0:1; Node *q; if(!root->next[k^1]){ q = root->next[k]; } else q = root->next[k^1]; for(int i = 29 ; i >= 0 ; i--){ k = (x&(1<<i)) == 0?0:1; if(!q->next[k^1]) q = q->next[k]; else q = q->next[k^1]; } // cout<<" get num : "<<q->num<<endl; ans = max(ans , q->num ^ x); } int main() { //freopen("test.in","rb",stdin); int n,a; while(~scanf("%d",&n)){ root = new Node(); ans = 0; for(int i=0;i<n;i++){ scanf("%d",&a); add_node(a); query(a); //cout<<" jsd: "<<i<<" "<<ans; } printf("%d\n",ans); } return 0; }
相关文章推荐
- CSU-1216: 异或最大值-trie-01字典树
- CSU 1216 异或最大值
- CSU 1216: 异或最大值(字典树+贪心)
- CSUOJ 1216 异或最大值 (01Trie)
- CSU 1216 异或最大值
- CSU_1216【异或最大值】
- CSU 1216 异或最大值(01Trie)
- CSU 1216 异或最大值【字典树】
- CSU 1216 异或最大值 01trie
- ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)
- csu-1216: 异或最大值
- CSU_1216(异或最大值)
- CSU 1216 —— 异或最大值
- BZOJ3261: 最大异或和
- BZOJ3261 最大异或和 【可持久化trie树】
- ☆ [HDU4825] Xor Sum「最大异或和(Trie树)」
- Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset(01字典树求最大异或值)
- COJ-1216 异或最大值
- CSU - 1529 Equator —— DP 最大连续和子序列
- POJ 3764 The xor-longest Path ( 字典树应用—— 求连续段相异或最大最小的线性算法)(好题)