compro-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ningenMe/compro-library

:heavy_check_mark: BinaryTrie
(lib/12-binary-search-tree/BinaryTrie.cpp)

Verified with

Code

/*
 * @title BinaryTrie
 * @docs md/12-binary-search-tree/BinaryTrie.md
 */
template<class Operator, int bit=60> class BinaryTrie{
    using TypeNode = typename Operator::TypeNode;
public:
    vector<TypeNode> node;
    vector<vector<int>> ch;
    BinaryTrie():node(1),ch(1,vector<int>(2,-1)){}
    void operate(long long idx, const TypeNode var) {
        int curr=0;
        stack<int> st;
        for(int i=bit-1; 0 <= i; --i) {
            st.push(curr);
            int f=(idx>>i)&1;
            if(ch[curr][f]==-1) {
                node.push_back(Operator::unit_node);
                ch.push_back(vector<int>(2,-1));
                ch[curr][f] = (int)node.size()-1;
            }
            curr = ch[curr][f];
        }
        node[curr] = Operator::func_operate(node[curr],var);
        while(st.size()) {
            curr = st.top(); st.pop();
            node[curr]=Operator::unit_node;
            if(ch[curr][0]!=-1)	node[curr] = Operator::func_fold(node[ch[curr][0]],node[curr]);
            if(ch[curr][1]!=-1)	node[curr] = Operator::func_fold(node[curr],node[ch[curr][1]]);
        }
    }
    TypeNode fold(long long idx) {
        int curr=0;
        for(int i=bit-1; 0 <= i; --i) {
            int f=(idx>>i)&1;
            if(ch[curr][f]!=-1) curr = ch[curr][f];
            else return Operator::unit_node;
        }
        return node[curr];
    }
    long long min_bitwise_xor(long long x) {
        int curr=0;
        long long y=0;
        for(int i=bit-1; 0 <= i; --i) {
            long long f=(x>>i)&1;
            if(!node[curr]) break;
            if(ch[curr][f]!=-1 && node[ch[curr][f]]) curr = ch[curr][f];
            else curr = ch[curr][f^=1];
            y^=(f<<i);
        }
        return y^x;
    }
};
#line 1 "lib/12-binary-search-tree/BinaryTrie.cpp"
/*
 * @title BinaryTrie
 * @docs md/12-binary-search-tree/BinaryTrie.md
 */
template<class Operator, int bit=60> class BinaryTrie{
    using TypeNode = typename Operator::TypeNode;
public:
    vector<TypeNode> node;
    vector<vector<int>> ch;
    BinaryTrie():node(1),ch(1,vector<int>(2,-1)){}
    void operate(long long idx, const TypeNode var) {
        int curr=0;
        stack<int> st;
        for(int i=bit-1; 0 <= i; --i) {
            st.push(curr);
            int f=(idx>>i)&1;
            if(ch[curr][f]==-1) {
                node.push_back(Operator::unit_node);
                ch.push_back(vector<int>(2,-1));
                ch[curr][f] = (int)node.size()-1;
            }
            curr = ch[curr][f];
        }
        node[curr] = Operator::func_operate(node[curr],var);
        while(st.size()) {
            curr = st.top(); st.pop();
            node[curr]=Operator::unit_node;
            if(ch[curr][0]!=-1)	node[curr] = Operator::func_fold(node[ch[curr][0]],node[curr]);
            if(ch[curr][1]!=-1)	node[curr] = Operator::func_fold(node[curr],node[ch[curr][1]]);
        }
    }
    TypeNode fold(long long idx) {
        int curr=0;
        for(int i=bit-1; 0 <= i; --i) {
            int f=(idx>>i)&1;
            if(ch[curr][f]!=-1) curr = ch[curr][f];
            else return Operator::unit_node;
        }
        return node[curr];
    }
    long long min_bitwise_xor(long long x) {
        int curr=0;
        long long y=0;
        for(int i=bit-1; 0 <= i; --i) {
            long long f=(x>>i)&1;
            if(!node[curr]) break;
            if(ch[curr][f]!=-1 && node[ch[curr][f]]) curr = ch[curr][f];
            else curr = ch[curr][f^=1];
            y^=(f<<i);
        }
        return y^x;
    }
};
Back to top page