zoukankan      html  css  js  c++  java
  • [二进制trie][贪心]CSUOJ1216异或最大值

    题目传送门

    过了好久,终于重新开始写博客了。。。

    这是一道二进制trie树的模板题。

    二进制trie树,理解一下就是一颗二叉树,左右儿子为0或1。

    然后每插入一个数就进行一次Find操作。

    Find:对于一个数x,我们在trie上总是走x在二进制下第i位的相反的那个节点。(当存在此节点时)

    Code:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int Maxn=1e5+5;
    int N,x,Ans,tr[Maxn][2],Cnt;
    void I(int x){
        int Node=0;
        for(int i=31;~i;i--){
            if(!tr[Node][(x>>i)&1])tr[Node][(x>>i)&1]=++Cnt;
            Node=tr[Node][(x>>i)&1];
        }
    }
    int F(int x){
        int Node=0,Sum=0;
        for(int i=31;~i;i--){
            int l=(x>>i)&1^1,r=(x>>i)&1;
            if(!tr[Node][l])Node=tr[Node][r],Sum+=r<<i;
            else Node=tr[Node][l],Sum+=l<<i;
        }
        return Sum^x;
    }
    int main()
    {
        while(~scanf("%d",&N)){
            memset(tr,0,sizeof tr),Ans=Cnt=0;
            for(int i=1;i<=N;i++){
                scanf("%d",&x);
                I(x);Ans=max(Ans,F(x));
            }
            printf("%d
    ",Ans);
        }
        return 0;
    }
  • 相关阅读:
    2019.8.15刷题统计
    2019.8.12刷题统计
    2019.8.11刷题统计
    2019.8.10刷题统计
    2019.8.9刷题统计
    2019.8.8刷题统计
    2019.8.7刷题统计
    2019.8.6刷题统计
    xuezhan.org 6.28
    xuezhan.org 6.27
  • 原文地址:https://www.cnblogs.com/Cptraser/p/9159460.html
Copyright © 2011-2022 走看看