HDU 5536 Chip Factory Trie
题意:
给出\(n(3 \leq n \leq 1000)\)个数字,求\(max(s_i+s_j) \bigoplus s_k\),而且\(i,j,k\)互不相等。
分析:
把每个数字看成一个\(01\)字符串插入倒Trie树中去,枚举\(i\)和\(j\),然后把\(s_i\)和\(s_j\)从Trie树中删去。
然后在Trie树中贪心找到能与\(s_i+s_j\)异或得到的最大值。
具体匹配的过程中是这样的,首先看树中最高位能否异或得到\(1\)。
能的话就往能的那个方向走,否则往另外一个方向走。
另外删除操作是这样实现的,我们每个节点记录一个\(val\)值。
插入时对所有经过节点的\(val\)值加\(1\),删除就将对应节点的\(val\)值减\(1\)。
在树上匹配的时候就只走那些\(val\)值为正的节点。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000 + 10;
const int maxnode = 100000 + 10;
int n;
int s[maxn];
int sz;
int ch[maxnode][2];
int val[maxnode];
void init() {
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
}
//d=1表示插入,d=-1表示删除
void update(int v, int d) {
int u = 0;
for(int i = 30; i >= 0; i--) {
int c = (v >> i) & 1;
if(!ch[u][c]) {
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
val[u] += d;
}
}
int match(int v) {
int ans = 0, u = 0;
for(int i = 30; i >= 0; i--) {
int c = (v >> i) & 1;
if(ch[u][c^1] && val[ch[u][c^1]]) {
ans |= (1 << i);
u = ch[u][c^1];
}
else u = ch[u][c];
}
return ans;
}
int main()
{
int T; scanf("%d", &T);
while(T--) {
init();
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", s + i);
update(s[i], 1);
}
int ans = (s[1] + s[2]) ^ s[3];
for(int i = 1; i < n; i++) {
update(s[i], -1);
for(int j = i + 1; j <= n; j++) {
update(s[j], -1);
int t = match(s[i] + s[j]);
ans = max(ans, t);
update(s[j], 1);
}
update(s[i], 1);
}
printf("%d\n", ans);
}
return 0;
}
HDU 5536 Chip Factory Trie的更多相关文章
- HDU 5536 Chip Factory 【01字典树删除】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5536 Chip Factory Time Limit: 18000/9000 MS (Java/Ot ...
- HDU 5536 Chip Factory 字典树+贪心
给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...
- 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: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- 2015ACM/ICPC亚洲区长春站 J hdu 5536 Chip Factory
Chip Factory Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- HDU 5536 Chip Factory
Chip Factory Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- hdu 5536 Chip Factory 字典树+bitset 铜牌题
Chip Factory Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)T ...
- 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字典树,然 ...
随机推荐
- 原创 html动态表格
<table id="opttb"> <asp:Repeater ID="tempOptions" runat="server&qu ...
- 死磕 java原子类之终结篇(面试题)
概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...
- feign实现服务间的负载均衡
feign Feign是一个声明式的Web Service客户端,它使得编写Web Serivce客户端变得更加简单.我们只需要使用Feign来创建一个接口并用注解来配置它既可完成.它具备可插拔的注解 ...
- iOS 最新判断机型设备方法
#define isIphoneXXS [UIScreen mainScreen].bounds.size.width == 375 && [UIScreen mainScreen] ...
- Hadoop 2.7.0模拟分布式实验环境搭建[亲测]
实验目的: 本实验通过在PC电脑上同时运行3个虚拟机,一个为master节点,两个slave节点. 搭建环境: 主机:mac os 10.10 OS:CenOS 6.5 虚拟机:VMware ...
- SQL Server Sleeping会话占用内存资源浅析?
在SQL Server中,会话的状态有运行(Running).睡眠(Sleeping).休眠(Dormant).Preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(Sleepi ...
- 如何使用Java代码给图片增加倒影效果
效果 倒影率为90%时的效果: 倒影率10%时的效果: 实现原理 倒影率作为参数rate 传入Reflection button的事件处理函数: CreateImageWithReflection这个 ...
- [dp][uestc oj][最长上升子序列] LIS N - 导弹拦截
N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- JEECMS开发问题汇总
1 添加Controller 将controller文件放在com.jeecms.cms.action.front包中, 图1.1 然后在jeecms-servlet-front-action.xml ...
- MFC:DISP_FUNCTION 参数
/*#include <afxdisp.h>DISP_FUNCTION( theClass, pszName, pfnMember, vtRetVal, vtsParams )参数:the ...