【封装】Trie

#include<cstdio>
const int N = 1e6 + 5;

struct Trie{
    int root, id;
    bool bit[32];
	
    struct Node{
        int val, siz, ch[2];
        Node(){  ch[0] = ch[1] = -1,  val = siz = 0; }
    }node[N];

    void get(int x){
        for(int i = 0; i < 32; ++i, x >>= 1)  bit[i] = x & 1;
    }

    void init(){
        for(int i = 0; i <= id; ++i){
            node[i].ch[0] = node[i].ch[1] = -1;
            node[i].val = node[i].siz = 0;
        }
        id = root = 0;
    }

    void insert(int x){
        get(x);       
        int u = root;
        for(int i = 31; i >= 0; --i){
            if(node[u].ch[bit[i]] == -1)  node[u].ch[bit[i]] = ++id;
            u = node[u].ch[bit[i]];
            ++node[u].siz;
        }
        node[u].val = x;
    }

    int find(int x){    // 返回与x异或最大的数
        get(x);
        int u = root;
        for(int i = 31; i >= 0; --i){
            int s1 = node[u].ch[!bit[i]], s2 = node[u].ch[bit[i]];
            if(s1 != -1 && node[s1].siz > 0)  u = s1;
            else if(s2 != -1 && node[s2].siz > 0)  u = s2;
            else  return x;  // 注意根据需要调整返回值
        }  
        return node[u].val;
    }

    void del(int x){
        get(x);
        int u = root;
        for(int i = 31; i >= 0; --i){
            u = node[u].ch[bit[i]];
            --node[u].siz;
        }
    }
}trie;
你只有十分努力,才能看上去毫不费力。
原文地址:https://www.cnblogs.com/214txdy/p/14085758.html