0w1

CFR 706 D. Vasiliy's Multiset ( XOR Trie )

Problem - D - Codeforces
經典的 XOR Trie,沒什麼好說的。
這次的題目都好簡單,要不是那天有SAT模考就能大賺一波rating了...

struct Trie{
    Trie *ch[ 2 ];
    int cnt;
    Trie(){
        ch[ 0 ] = ch[ 1 ] = NULL;
        cnt = 0;
    }
    void add( int v, int k ){
        if( k < 0 ) return;
        int g = v >> k & 1;
        if( ch[ g ] == NULL ) ch[ g ] = new Trie();
        ++ch[ g ]->cnt;
        ch[ g ]->add( v, k - 1 );
    }
    void erase( int v, int k ){
        if( k < 0 ) return;
        int g = v >> k & 1;
        if( ch[ g ] == NULL ) ch[ g ] = new Trie();
        --ch[ g ]->cnt;
        ch[ g ]->erase( v, k - 1 );
    }
    void get_max_xor( int v, int k, int &res ){
        if( k < 0 ) return;
        res <<= 1;
        int g = v >> k & 1;
        if( ch[ g ^ 1 ] and ch[ g ^ 1 ]->cnt ) ch[ g ^ 1 ]->get_max_xor( v, k - 1, res |= 1 );
        else ch[ g ]->get_max_xor( v, k - 1, res );
    }
};

void solve(){
    Trie *root = new Trie();
    root->add( 0, 30 );
    int Q; cin >> Q;
    for( int i = 0; i < Q; ++i ){
        string op; cin >> op;
        int x; cin >> x;
        if( op == "+" ){
            root->add( x, 30 );
        } else if( op == "-" ){
            root->erase( x, 30 );
        } else{
            int ans = 0;
            root->get_max_xor( x, 30, ans );
            cout << ans << "\n";
        }
    }
}