传送门:HDU 5536


题目大意:

在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i、j、k 各不相同。

前至技能:01字典树详解。

思路:

01字典树模板可以解决查找与 x 异或结果最大的数和结果值。本题由于数据很小,可以两层循环求出两个不同数的和,然后在剩余的数中用 01字典树求与它们的和异或最大的结果值。

这里有个问题就是怎么保证找到的数与求和的两个数的下标不同,这里我们可以在查询 x 和 y 的和之前,先把 x 和 y 在 01字典树中去除,等查询完后再加上。

当然上面的去除和添加并不是真正的去除和添加,而是我们可以增加一个数组 num,用来记录每个节点被访问的次数,每次改变节点的访问次数即可。

注意:

代码中数据类型为 LL的部分都不可以改成 int 型,理论上是不会超过 int 型的,我也不知道为什么……有知道的大神,还请告知。

代码:

#include<stdio.h>
#include<iostream>
#define MAXN 1010
typedef long long LL;
using namespace std;int tol; //节点个数
LL val[32*MAXN]; //点的值
int num[32*MAXN]; //每个节点被访问的次数
int ch[32*MAXN][2]; //边的值 void init()
{ //初始化 tol=1;ch[0][0]=ch[0][1]=0;
}void insert(LL x)
{ //往 01字典树中插入 x int u=0;for(int i=32;i>=0;i--){int v=(x>>i)&1;if(!ch[u][v]){ //如果节点未被访问过 ch[tol][0]=ch[tol][1]=0; //将当前节点的边值初始化 val[tol]=0; //节点值为0,表示到此不是一个数 num[tol]=0; //每个节点被访问的次数+1 ch[u][v]=tol++; //边指向的节点编号 }u=ch[u][v]; //下一节点 num[u]++;}val[u]=x; //节点值为 x,即到此是一个数
}void update(LL x,int add)
{ //更新插入或删除 x后每个节点被访问的次数 int u=0;for(int i=32;i>=0;i--){int v=(x>>i)&1;u=ch[u][v];num[u]+=add;}
}LL query(LL x)
{ //查询所有数中和 x异或结果最大的数 int u=0;for(int i=32;i>=0;i--){int v=(x>>i)&1;//利用贪心策略,优先寻找和当期位不同的数 if(ch[u][v^1]&&num[ch[u][v^1]]) u=ch[u][v^1];else u=ch[u][v];}return x^val[u]; //返回结果
}int main()
{int i,j,t,n;LL a[MAXN],ans;scanf("%d",&t);while(t--){init();scanf("%d",&n);for(i=0;i<n;i++){scanf("%lld",&a[i]);insert(a[i]);}ans=0;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j) continue;update(a[i],-1);update(a[j],-1);ans=max(ans,query(a[i]+a[j]));update(a[i],1);update(a[j],1);}printf("%lld\n",ans);}return 0;
}

HDU 5536 Chip Factory (01字典树)相关推荐

  1. HDU 5536 Chip Factory 01字典树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5536 题意:数组中求 i,j,k 最大的(A[i] + A[j]) xor A[k] i != j ...

  2. HDU 5536 Chip Factory 字典树+贪心

    给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...

  3. 字典树,01字典树,可持续化01字典树(总结+例题)

    目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...

  4. HDU 4825:Print Article(01字典树)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  5. 字典树01字典树专题对字典树的理解

    对于字典树和01字典树的一点理解: 首先,字典树建树的过程就是按照每个数的前缀来的,如果你要存储一个全小写字母字符串,那么这个树每一个节点最多26个节点,这样的话,如果要找特定的单词的话,按照建树的方 ...

  6. 字典树 01字典树【数据结构】

    题目1:字典树 HDU 1251 统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以 ...

  7. 字典树与01字典树详解

    [镇楼]   不满足于粗浅的表面了解字典树吗,今天!由我给大家带来!字典树与01字典树的解析!! 目录 [引入] [字典树] [01字典树] [引用参考] [引入] 字典是干啥的?查找字的.那么字典树 ...

  8. hdu5296 01字典树

    根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...

  9. Beautiful Subarrays (01字典树 瞎搞)

    题意: 题解: 一看问的是子序列,并且还是异或. 首先想到01字典树,再一看让你求子序列的个数,大致是想让你把这个序列进行前缀异或处理后然后再01字典树上进行操作吧. 假设01字典树往左边是0右边是1 ...

最新文章

  1. THE TOP FILE(top文件详解)
  2. 关于动画培养灵感的网站
  3. 一个countDown在多线程调度下使用不当的分享
  4. P3952-时间复杂度【模拟】
  5. LVM( Logical Volume Manager )配置案例(on RHEL4)
  6. lvs负载均衡—DR模式
  7. Markdown Pad2--公式编辑功能搭建
  8. SOA技术相关介绍(RPC, Web Service, REST,SOAP,JMI)
  9. 关于工厂创建问题,一个纠结的终结源于KFC
  10. windows下python3安装pip方法详解
  11. 小米手机解锁 usb3.0状态下
  12. php 公众号微信支付流程图,微信公众号支付流程
  13. Matlab求极限图解
  14. 网易Python爬虫:爬取网易科技频道文章存入MySQL数据库
  15. deflate与gzip
  16. linux怎么随机生成数字,详解Linux如何生成随机数字和字符串
  17. [ 物联网篇 ] 27 -使用libcur API 实现本地时间同步的功能,类似NTP功能
  18. 实战一:爬取拉勾网职位信息
  19. 【实验总结1】在LCD1602液晶显示屏上显示字符、数字、流动字幕等
  20. 阿里云服务器新用户优惠

热门文章

  1. 短号集群网,移动的流氓业务,真够流氓的
  2. 向日葵远程协助无法开启黑屏
  3. 那些年我同桌遇到的bug①
  4. Hostease有哪些优势?
  5. 物品租赁买卖业务平台HTML5模板源码下载
  6. Linux源码编译安装Postgres
  7. Go语言核心36讲(Go语言实战与应用十三)--学习笔记
  8. 知识人脉和经验究竟哪个是成功路上最重要的元素
  9. 写给年轻人的交友和人脉建议
  10. 产业洞察 | 阿里云宣称“全面上云的拐点到了”,预示着什么?