1. 程式人生 > >【模擬試題】與最大 Trie

【模擬試題】與最大 Trie

題目描述

  給你一個長度為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; }