Trie - Dr. Evil Underscores - CodeForces - 1285D

Trie - Dr. Evil Underscores - CodeForces - 1285D

題意:

na1,a2,...,anX使maxi=1n(aiX)給定一個長度爲n的序列a_1,a_2,...,a_n,選擇一個整數X,使得\max_{i=1}^{n}(a_i⊕X)的值最小,並輸出這個最小值。

Examples:Examples:

Input:
3
1 2 3

Output:
2


Input:
2
1 5

Output:
4

Note:
In the first sample, we can choose X=3.
In the second sample, we can choose X=5.

數據範圍:

n[1,100000]ai[0,2301]Time limit:1000msMemory limit:262144kBn∈[1,100000],a_i∈[0,2^{30}-1]。\\Time \ limit:1000 ms,Memory\ limit:262144 kB

題解:

na30(a2301)TrieTrie0110①、對n個整數a以長度爲30(因爲a最大取2^{30}-1)的二進制碼的形式建立Trie。\\②、接着爆搜最終的答案。\\\qquad若Trie樹上的節點的'0'孩子缺失,則搜索其'1'孩子;若'1'孩子缺失,則搜索其'0'孩子;\\\qquad若均未缺失,則選擇計算結果更小的孩子的值。


代碼:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>

using namespace std;

const int N=1e5+10,M=30*N;
int son[M][2],n,idx,a;

void Insert(int x)
{
    int p=0;
    for(int i=29;i>=0;i--)
    {
        int u=x>>i&1;
        if(!son[p][u]) son[p][u]=++idx;
        p=son[p][u];
    }
}

int dfs(int p,int k)
{
    if(k==-1) return 0;
    if(son[p][0]==0) return dfs(son[p][1],k-1);
    else if(son[p][1]==0) return dfs(son[p][0],k-1);
    else return (1<<k) + min(dfs(son[p][1],k-1),dfs(son[p][0],k-1));
}

int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a);
        Insert(a);
    }

    int ans=dfs(0,29);
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章