最大異或對(01字典樹)

在這裏插入圖片描述

思路:01字典樹

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <set>
#include <sstream>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<cmath>
#include<cctype>
#include<cstring>
#include<cstdlib>
#define MAXX 100005
#define SIS std::ios::sync_with_stdio(false)
#define ll long long
#define INF 0x3f3f3f3f
//#include<bits/stdc++.h>
using namespace std;
const int MAX =1e5+20;
const double PI = 3.14159265359;
//const int mod = 1e9 + 7;
int n, m;
int trie[MAX*32][2], len, root, tot;
ll sum[MAX*32];
bool p;
char s[12];
ll a[MAX*32];
void Insert(ll x)
{

    root = 0;
    for (int i = 32; i >=0; i--)
    {
        int id =((x>>i)&1);//轉爲2進制;
        if (!trie[root][id]){
           // memset(trie[id],0,sizeof(trie[id]));
            trie[root][id] = ++tot;
            sum[id]=0;
        }
        root = trie[root][id];
    }
    sum[root]=x;
}
ll Search(ll x)
{
    root = 0;

    for (int i = 32; i>=0; i--)
    {
        int id =((x>>i)&1);
        if(trie[root][id^1])///如果亦或值存在
            root=trie[root][id^1];
        else
            root=trie[root][id];
    }
    return sum[root];
}
int main()
{

   int t;
  // scanf("%d",&t);


       memset(trie,0,sizeof(trie));
       memset(sum,0,sizeof(sum));
       tot=0;
      scanf("%d",&n);
       for(int i=1;i<=n;i++)
       {
           ll x;
          scanf("%lld",&x);
          a[i]=x;
           Insert(x);
       }
      ll ans=0;
       for(int i=1;i<=n;i++)
       {
           int x=Search(a[i]);
         ans=max(ans,a[i]^x);
       }
       cout<<ans<<endl;

    return 0;

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章