Cod sursa(job #2053785)

Utilizator mlc_oficialBoris Barca mlc_oficial Data 1 noiembrie 2017 12:35:31
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <iostream>
#include <cstring>
#include <fstream>
#include <cctype>

using namespace std;

constexpr int kBuffSize = 498765;

int to[kBuffSize][1 << 5];

inline char GetChar() {
    static constexpr int kBuffSize = (1 << 12);
    static char buff[kBuffSize];
    static int pointer = kBuffSize;
    if (pointer == kBuffSize) {
        fread(buff, 1, kBuffSize, stdin);
        pointer = 0;
    }    
    return buff[pointer++];
}
 
inline int ReadInt() {
    char c;
    do { c = GetChar(); } while (not isdigit(c));
     
    int number = 0;
    do {
        number = (number << 1) + (number << 3) + (c - '0');
        c = GetChar();
    } while (isdigit(c));
    return number;
}

int buffer_idx;

void InsertTrie(int number) {
    int node = 0;
    for (int i = 0; i < 7; i += 1) {
        int& x = to[node][number & 31];
        if (x == -1) {
            x = ++buffer_idx;    
        }
        
        node = x;
        number >>= 5;
    }
}

void EraseTrie(int number) {
    int node = 0;
    for (int i = 0; i < 6; i += 1) {
        int& x = to[node][number & 31];
        if (x == -1) {
            return;
        }
        
        node = x;
        number >>= 5;
    }
    to[node][number & 31] = -1;
}

bool QueryTrie(int number) {
    int node = 0;
    for (int i = 0; i < 7; i += 1) {
        int& x = to[node][number & 31];
        if (x == -1) {
            return false;
        }
        
        node = x;
        number >>= 5;
    }    
    return true;
}

int main() {
    #ifdef INFOARENA
    freopen("hashuri.in", "r", stdin);
    freopen("hashuri.out", "w", stdout);
    #endif
    
    memset(to, -1, sizeof to);
    
    int q = ReadInt();
    while (q--) {
        int type = ReadInt(), number = ReadInt();
        if (type == 1) {
            InsertTrie(number);
        } else if (type == 2) {
            EraseTrie(number);
        } else {
            putchar_unlocked(QueryTrie(number) + '0');
            putchar_unlocked('\n');
        }
    }
}