HDU-5536 Chip Factory,又见字典树,好题+1!
Chip Factory
题意:一个n个数的数列,求三个数其中两个数的和与另外一个数的异或值最大,输出这个最大值。
思路:和前面那个百度之星资格赛HDU4825的类似,多了两个过程,一个是枚举和,另一个是删除过程,第一次写删除操作,还一遍A了,小激动。
会不会是后台水,东北师范官方没有给出标准测试数据,也就是说这数据是hdu YY的,我猜是这样,碰到过类似的情况,错误的代码竟然A了区域赛的题。这样为了AC貌似有点不好呀,不过思路很值得学习!
struct tree
{
int f;
tree *next[N];
tree()
{
for(int i=0; i<N; i++) next[i]=NULL;
f=0;
}
}*root;
int a[33];
ll s[1005];
void ch(ll x)//转化为二进制
{
memset(a,0,sizeof(a));
int len=0;
while(x)
{
a[len++]=x%2;
x/=2;
}
}
void insert(ll x)//插入一个数
{
ch(x);
int len=32;//长度最多32位
tree *p=root;
while(len>=0)
{
int id=a[len];
if(p->next[id]==NULL)
{
tree *temp=new tree;
p->next[id]=temp;
}
p=p->next[id];
p->f++;//每个点都构成一个数,经过此点,次数加一
len--;
}
}
ll query(ll x)
{
ch(x);
tree *p=root;
for(int i=0; i<33; i++) a[i]^=1;//不一定要这样,只是写HDU4825的时候用的这种思路
int len=32;
ll ans=0;
while(len>=0)
{
int id=a[len];
if(p->next[id]==NULL||p->next[id]->f==0) id^=1;//为0表示此节点被撤销了,另寻他路
if(id) ans+=(ll)1<<len;
p=p->next[id];
len--;
}
return ans^x;
}
void fre(ll x)
{
ch(x);
int len=32;
tree *p=root;
while(len>=0)
{
int id=a[len];
p->next[id]->f--;//撤销路径
p=p->next[id];
len--;
}
}
void del(tree *root)
{
for(int i=0; i<N; i++)
if(root->next[i])
del(root->next[i]);
delete(root);
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
root=new tree;
for(int i=0; i<n; i++)
{
scanf("%I64d",&s[i]);
insert(s[i]);
}
ll ans=0;
for(int i=0; i<n; i++)
{
fre(s[i]);
for(int j=i+1; j<n; j++)
{
fre(s[j]);
ans=max(ans,query(s[i]+s[j]));//撤销点,枚举和
insert(s[j]);
}
insert(s[i]);
}
printf("%I64d\n",ans);
del(root);
}
return 0;
}
HDU-5536 Chip Factory,又见字典树,好题+1!的更多相关文章
- HDU 5536 Chip Factory 【01字典树删除】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5536 Chip Factory Time Limit: 18000/9000 MS (Java/Ot ...
- ACM学习历程—HDU 5536 Chip Factory(xor && 字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题目大意是给了一个序列,求(si+sj)^sk的最大值. 首先n有1000,暴力理论上是不行的. ...
- HDU 5536 Chip Factory (暴力+01字典树)
<题目链接> 题目大意: 给定一个数字序列,让你从中找出三个不同的数,从而求出:$\max_{i,j,k} (s_i+s_j) \oplus s_k$的值. 解题分析:先建好01字典树,然 ...
- HDU 5536 Chip Factory 字典树+贪心
给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...
- HDU 5536 Chip Factory 字典树
Chip Factory Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- hdu 5536 Chip Factory 字典树+bitset 铜牌题
Chip Factory Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- Chip Factory(01字典树)
Chip Factory http://acm.hdu.edu.cn/showproblem.php?pid=5536 Time Limit: 18000/9000 MS (Java/Others) ...
- hdu 5536 Chip Factory (01 Trie)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536 题面; Chip Factory Time Limit: 18000/9000 MS (Java/O ...
- HDU 5536 Chip Factory
Chip Factory Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
随机推荐
- java mongodb-crud
本篇文章主要介绍了mongodb对应java的常用增删改查的api,以及和spring集成后mongoTemplate的常用方法使用,废话不多说,直接上代码: 1.首先上需要用到的两个实体类User和 ...
- BZOJ3073: [Pa2011]Journeys(线段树优化建图 Dijkstra)
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_ ...
- 一张图告诉你,只会这些HTML还远远不够!!!!!
不知道自己HTML水平如何,不知道HTML5如何进化?看这张图 如果一半以上的你都不会,必须看这本书,阿里一线工程师用代码和功能页面来告诉你每一个技术点. 都会一点,但不知道如何检验自己,看看本书提供 ...
- SQL Server 2008 转换为 SQL 2005 数据库 脚本生成
Tips: 本文讨论如何把数据库从SQL Server 2008版本降低到2005,因为在本地开发是以SQL Server 2008 Express Edition版本进行的,而主机提供商现在提供的M ...
- pingall脚本
p i n g a l l:一个按照/ e t c / h o s t s文件中的条目逐一p i n g所有主机的脚本 它能够按照/ e t c / h o s t s文件中的条目逐一p i n g所 ...
- python中中括号中的负数
>>> a="a,b,c,d,e">>> a.split(",")[0:2]['a', 'b']>>> a ...
- VS2010中C++ 出现fatal error LNK1169: 找到一个或多个多重定义的符号
一般是函数重定义造成的 例如定义了两个 sum(x,y)函数
- Unity之脚本编译顺序
根据官方的解释,它们的编译顺序如下: (1)所有在Standard Assets.Pro Standard Assets或者Plugins文件夹中的脚本会产生一个Assembly-CSharp-fil ...
- 联想e431笔记本更改硬盘模式bios设置的详细教程
用硬盘安装系统,就要进入bios,将硬盘改为第一启动项即可重装系统.不同品牌的电脑,它的bios设置方法也就不同.那么,联想e431笔记本要如何更改硬盘模式呢?今天U大侠小编就和大家分享联想e431笔 ...
- 数组初始化 和 vector初始化
] = {}; 整个数组都初始化为0 vector<); 整个vector初始化为1 如果你定义的vector是这样定义的: vector<int> B; 去初始化,千万不要用: ; ...