【HDU】 5536 Chip Factory
2016-03-14 17:30
274 查看
Chip Factory
题目链接Chip Factory
题目大意
说有一组数,你需要从其中选取3个数a b c,使得(a+b) xor c 达到最大。
题解
建立一棵字典树,每个数用2进制表示插入树中,我们先枚举a跟b,将a跟b从字典树中删除,最后在字典树中查找a+b的“反码”(因为要使最后的异或结果最大)。如果有节点就继续查找,没有节点就走另一边。
代码
#include <iostream> #include <cstring> #include <cstdio> using namespace std; struct Trie { Trie *ch[2]; int val; }; Trie *root; int a[1005],T,n,ans; void _insert(int s) { Trie *p=root,*q; for (int i=30;i>=0;i--) { int ch; if (s&(1<<i)) ch=1; else ch=0; if (p->ch[ch]) p->ch[ch]->val++; else { q=new Trie; for (int i=0;i<2;i++) q->ch[i]=NULL; q->val=1; p->ch[ch]=q; } p=p->ch[ch]; } } void _delete(int s) { Trie *p=root; int ch; for (int i=30;i>=0;i--) { if (s&(1<<i)) ch=1; else ch=0; if (p->ch[ch]) p->ch[ch]->val--; p=p->ch[ch]; } } int solve(int n) { int ans=1; for (int i=1;i<=n;i++) ans*=2; return ans; } int qur(int s) { Trie *p=root; int num,ans=0; for (int i=30;i>=0;i--) { if (s&(1<<i)) num=0; else num=1; if (p->ch[num] && p->ch[num]->val) { ans+=solve(i); p=p->ch[num]; } else if (p->ch[!num]) p=p->ch[!num]; } return ans; } void del(Trie *p) { for (int i=0;i<2;i++) if (p->ch[i]) del(p->ch[i]); delete []p; } int main() { scanf("%d",&T); while (T--) { root=new Trie; for (int i=0;i<2;i++) root->ch[i]=NULL; ans=0; scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%d",&a[i]); _insert(a[i]); } for (int i=0;i<n-1;i++) { _delete(a[i]); for (int j=i+1;j<n;j++) { _delete(a[j]); ans=max(ans,qur(a[i]+a[j])); _insert(a[j]); } _insert(a[i]); } printf("%d\n",ans); del(root); } return 0; }
相关文章推荐
- 【Leetcode】之Maximum Product Subarray
- mysql中的隐式转换
- VS2013配置Qt5.4
- 函数的学习
- Android设计模式系列(12)--SDK源码之生成器模式(建造者模式)
- Java异常相关的面试题(上)
- js加载一个地方出错造成后续没有编译
- NSData转NSString时为空
- c/c++字符串操作函数源码解析
- java 代理的三种实现方式
- 01.SQLServer性能优化之----强大的文件组----分盘存储
- 【JVM】JVM系列之执行引擎(五)
- 低效素数算法
- C++第二次上机实验2
- vi中的撤销与重做
- 如何离线安装chrome插件
- 分布式文件系统FastDFS设计原理
- 有用的Unity社区贴
- 猜一猜这干啥呢。。
- 浅谈Spring的InitializingBean和init-method