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 ;
}
上一篇:MySQL主从数据库的安装


下一篇:PowerDesigner导入sql脚本生成物理模型