hdu5536 Chip Factory 字典树+暴力 处理异或最大 令X=(a[i]+a[j])^a[k], i,j,k都不同。求最大的X。
/**
题目:hdu5536 Chip Factory
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5536
题意:给定n个数,令X=(a[i]+a[j])^a[k], i,j,k都不同。求最大的X。 思路:字典树,由于转化为二进制最大是32位。将所有数转化为二进制,不足32位补0.
然后逆序插入字典树(逆序是为了查询的时候,保证先找最大的位,这样结果才是最大的)。
枚举i,j。从字典树删除i,j。然后在字典树找k。计算结果。然后把i,j的数重新插入。 */ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxnode = 3e4+;///最多可能有多少个节点
const int maxn = 1e3+;
const int sigma_size = ;///0或者1
int ch[maxnode][sigma_size];///由于很大,所以结构体内部放不下。要放在外面。
int a[maxn];
int save[];
int z;
struct Trie{
int val[maxnode];
int sz;
int idx(char c){return c-'a';} void insert(int *s)
{
int u = ;
z--;
while(z>=){
int c = s[z];
if(!ch[u][c]){
memset(ch[sz], , sizeof ch[sz]);
val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
val[u]++;
z--;
}
}
void del(int *s)
{
int u = ;
z--;
while(z>=){
int c = s[z];
u = ch[u][c];
val[u]--;
z--;
}
} LL query(int *s)
{
int u = ;
LL ans = ;
z--;
while(z>=){
int c = s[z];
if(ch[u][!c]&&val[ch[u][!c]]){///因为删除数字之后,ch[u][!c]没有处理,所以要通过val来判断是否还存在。
ans = ans*+;
u = ch[u][!c];
}else
{
ans = ans*;
u = ch[u][c];
}
z--;
}
return ans;
}
};
void getSave(int n)
{
z = ;
while(n){
save[z++] = n%;
n /= ;
}
while(z<){ ///存了32个数。
save[z++] = ;
}
}
int main()
{
int T, n;
Trie trie;
cin>>T;
while(T--)
{
scanf("%d",&n);
trie.sz = ;
memset(ch[], , sizeof ch[]);
for(int i = ; i < n; i++){
scanf("%d",&a[i]);
getSave(a[i]);
trie.insert(save);
}
LL ans = ;
for(int i = ; i < n; i++){
for(int j = i+; j < n; j++){
getSave(a[i]);
trie.del(save);
getSave(a[j]);
trie.del(save);
getSave(a[i]+a[j]);
ans = max(ans,trie.query(save));
getSave(a[i]);
trie.insert(save);
getSave(a[j]);
trie.insert(save);
}
}
printf("%lld\n",ans);
}
return ;
}
hdu5536 Chip Factory 字典树+暴力 处理异或最大 令X=(a[i]+a[j])^a[k], i,j,k都不同。求最大的X。的更多相关文章
- 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 ...
- AcWing:143. 最大异或对(01字典树 + 位运算 + 异或性质)
在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...
- [HDU-5536] Chip Factory (01字典树)
Problem Description John is a manager of a CPU chip factory, the factory produces lots of chips ever ...
- HDU-5536 Chip Factory,又见字典树,好题+1!
Chip Factory 题意:一个n个数的数列,求三个数其中两个数的和与另外一个数的异或值最大,输出这个最大值. 思路:和前面那个百度之星资格赛HDU4825的类似,多了两个过程,一个是枚举和,另一 ...
- HDU4825 Xor Sum(字典树解决最大异或问题)
Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeus 发起M次询问,每次询问中包含一个正整 ...
- poj3764字典树路径最大异或和
The xor-longest Path Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6853 Accepted: 1 ...
- HDU-5536 Chip Factory (字典树)
题目大意:给n个数,编号为1~n,取三个编号不同的数,使表达式(a+b)^c的值最大. 题目分析:将这n个数按二进制位建立一棵trie.枚举i.j的和,查询亦或最大值,但在查询之前要把i.j在trie ...
随机推荐
- curl错误码大全
CURL状态码列表 状态码 状态原因 解释 0 正常访问 访问地址未返回结果 1 错误的协议 未支持的协议.此版cURL 不支持这一协议. 2 初始化代码失败 初始化失败. 3 URL格式不正确 UR ...
- Ftp上传文件
package net.util.common; import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...
- (转) java中try/catch性能和原理
stackoverflow上有一个讨论,参与的人还挺多: https://stackoverflow.com/questions/141560/should-try-catch-Go-inside-o ...
- JQuery插件:动态列和无间隙网格布局Mason.js
来源:GBin1.com 在线演示 JavaScript提供很多强有力的方案,解决动态列的网格布局(例如:Pinterest).这些方案很有效,但是,有时候,会造成网格的间隙或粗糙的边缘. Mason ...
- python读取文件特定的行数
from itertools import islice f=open("pyhpd.txt") for a in islice(f,2,6): print(a)
- vue - webpack.dev.conf.js for FriendlyErrorsPlugin
描述:webpack网页端友好的报错信息就来自它 官网:https://www.npmjs.com/package/friendly-errors-webpack-plugin new Friendl ...
- 算法笔记_074:子集和问题(Java)
目录 1 问题描述 2 解决方案 2.1 全排列思想求解 2.2 状态空间树思想求解 1 问题描述 求n个正整数构成的一个给定集合A = {a1,a2,a3,...,an}的子集,子集的和要等于一 ...
- java编写Loadrunner脚本
web.set_max_html_param_len("1000000"); lr.start_transaction("red_envelop"); web. ...
- git 关联远程分支
问题解析: git本地新建一个分支后,必须要做远程分支关联.如果没有关联, git 会在下面的操作中提示你显示的添加关联.关联目的是如果在本地分支下操作: git pull, git push ,不需 ...
- 【Linux】替换文本中的字符
替换单个文本中的字符,有两种方法,如下详解 VIM替换 打开文件 vim test.txt 替换 :%s/原字符串/替换字符串/gg 直接替换 sed -i 's/原字符串/替换字符串/g' `ls ...