【模擬試題】與最大 Trie
阿新 • • 發佈:2019-01-30
題目描述
給你一個長度為n的序列A,請你求出一對Ai,Aj使Ai“與”Aj最大。
Ps:“與”表示位運算and,在c++中表示為&。
資料範圍
(1<=i
樣例輸入
3
8
10
2
樣例輸出
8
解題思路
Trie樹,此題可以玄學過。。。直接sort一遍,用前30個來暴力算。。。
程式碼
#include <bits/stdc++.h>
using namespace std;
inline int Getint(){int x=0,f=1;char ch=getchar();while ('0'>ch||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
int cnt=0;
struct node{
int son[2];
bool sn[31];
void Init(){
memset(son,0,sizeof(son));
memset(sn,0,sizeof(sn));
}
}*Trie;
void Insert(int x){
int p=0,L;
for(int i=30;~i;i--){
bool t=x&(1<<i);
if(!Trie[p].son[t]){
Trie[p].son[t]=++cnt;
}
if(t)Trie[p].sn[i]=true;
L=p;
p=Trie[p].son[t];
}
}
int Ask(int x){
int p=0,Ans=0;
for(int i=30;~i;i--){
bool t=x&(1 <<i);
if(t){
if(Trie[p].son[1])Ans+=1<<i,p=Trie[p].son[1];
else if(Trie[p].son[0]) p=Trie[p].son[0];
else{
return Ans;
}
}else{
bool Move=false;
if(Trie[p].son[0]^Trie[p].son[1]){
p=Trie[p].son[bool(Trie[p].son[1])];
Move=true;
}
for(int j=i-1;!Move&&~j;j--){
if(x&(1<<j)){
if(Trie[Trie[p].son[0]].sn[j]^Trie[Trie[p].son[1]].sn[j]){
p=Trie[p].son[Trie[Trie[p].son[1]].sn[j]];
Move=true;
}
}
}
if(!Move)return Ans;
}
}
return Ans;
}
int main(){
Trie=(node*)malloc(sizeof(node)*2000000);
int n=Getint(),Ans=0;
for(int i=1;i<=n;i++){
int t=Getint();
Ans=max(Ans,i==1?0:Ask(t)),Insert(t);
}
cout<<Ans<<"\n";
return 0;
}