您的位置:首页 > 其它

HDU 5536 Chip Factory(字典树+经典应用)

2015-11-23 14:48 423 查看
题目链接

题意:给你n个数,问你max(a[i]+a[j])xor(a[k])的值,(i!=j!=k)

解答:这道题目和这道题基本上是一样的,但是这里要求三个数是不一样的 ,所以我们需要增加一个val数组,标示该位置是不是可以使用。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
//#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define X first
#define Y second
#define cl(a,b) memset(a,b,sizeof(a))
typedef pair<long long ,long long > P;
const int maxn=1000+100;
const LL inf=1LL<<45;
const LL mod=1e9+7;

struct Tree{
int Next[maxn*maxn][2];
LL End[maxn*maxn];
LL val[maxn*maxn];
int root,L;

int newNode(){
cl(Next[L],-1);
End[L]=0;
return L++;
}
void init(){
L=0;
root=newNode();
cl(val,0);
}
void Insert(LL x,LL vl){
int now=root;
for(int i=32;i>=0;i--){
int v=(x&(1LL<<i))?1:0;
if(Next[now][v]==-1){
Next[now][v]=newNode();
}
now=Next[now][v];
val[now]+=vl;
}
End[now]=x;
}
LL query(LL x){
//printf("x = %lld\n",x);
int now=root;
for(int i=32;i>=0;i--){
int v=(x&(1LL<<i))?1:0;
if(val[Next[now][!v]]&&Next[now][!v]!=-1){
now=Next[now][!v];
}
else {
now=Next[now][v];
}
}
//printf("End = %lld\n",End[now]);
return End[now]^x;
}
};
Tree tree;
LL a[maxn];
int main(){
int T;scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
tree.init();
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
for(int i=0;i<n;i++){
tree.Insert(a[i],1);
}
LL ans=0;
for(int i=0;i<n;i++){
tree.Insert(a[i],-1);//使用前删掉
for(int j=1+i;j<n;j++){
tree.Insert(a[j],-1);
ans=max(ans,tree.query(a[i]+a[j]));
tree.Insert(a[j],1);//再加回去
}
tree.Insert(a[i],1);
}
printf("%lld\n",ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: