Codeforces Round #613 (Div. 2)D. Dr. Evil Underscores Trie树上的简单dp

链接
题意 : 给n个数 求x与a[i]异或的最大值最小
思路:每个数拆成2进制数建立一个trie树,在trie树上dp即可
难点主要是实现方面
对trie树建边的思想没有理解很到位

#include<bits/stdc++.h>

#define warn printf("!*!!*\n")
#define debug(x,c) cout<<string(c)<<":"<<x<<endl

using namespace std;
typedef long long L;
const int maxn=1e7+10;
const int oo=1e9+7;
const int mod=998244353;

int a[maxn],trie[maxn][2],tot=0;

void init()
{

    for(int i=0;i<maxn;i++) trie[i][0]=trie[i][1]=-1;
}
int addedge(int x)
{
    int num[50];
    for(int i=30;i>=1;i--){
        num[i]=x%2;x/=2;
    }
    int p=0;
    for(int i=1;i<=30;i++){
        int c=num[i];
        //if(p==0&&c==1) cout<<i<<endl;
        if(trie[p][c]==-1){
            trie[p][c]=++tot;
        }
        p=trie[p][c];
    }
}
int dfs(int x,int w,int dep)
{
    if(dep>30)  return 0;
    int c=trie[x][0],v=trie[x][1];

    //debug(c,"c");
    //debug(v,"v");
    //debug(dep,"dep");
    //debug(dep,"dep");

// if(dep==28) cout<<c<<","<<v<<endl;


    if(c!=-1&&v!=-1) {

         int p=dfs(c,w/2,dep+1)+w;
         int q=dfs(v,w/2,dep+1)+w;


         return min(p,q);
    }
    else {
        if(c==-1) return dfs(v,w/2,dep+1);
        return dfs(c,w/2,dep+1);
    }

}

int main()
{
    int w=1<<29;
    int n;scanf("%d",&n);
    init();
    for(int i=1;i<=n;i++) {
        scanf("%d",&a[i]);
        addedge(a[i]);
    }

    printf("%d\n",dfs(0,w,1));

}

全部评论

相关推荐

湫湫湫不会java:1.在校经历全删了2.。这些荣誉其实也没啥用只能说,要的是好的开发者不是好好学生3.项目五六点就行了,一个亮点一俩行,xxx技术解决,xxx问题带来xxx提升。第一页学历不行,然后啥有价值的信息也没有,到第二页看到项目了,第一个项目九点,第二个项目像凑数的俩点。总体给人又臭又长,一起加油吧兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务