Cod sursa(job #2090022)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 17 decembrie 2017 14:55:08
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

struct Trie {
  int ends;
  int counter;
  Trie* next[2];
  Trie();
}*root;

Trie::Trie() {
  ends = counter = 0;
  for (int i = 0; i < 2; i++)
    next[i] = NULL;
}

void trieInsert(Trie*& node, int p) {
  if(!p) {
    node->ends++;
    return;
  }
  if(!node->next[p % 2]) {
    node->next[p % 2] = new Trie;
    node->counter++;
  }
  trieInsert(node->next[p % 2], p / 2);
}

bool trieRemove(Trie*& node, int p) {
  if(!p) {
    node->ends--;
  } else{
    if(!node->next[p % 2]) return false;

    if(trieRemove(node->next[p % 2], p / 2)) {
      node->next[p % 2] = NULL;
      node->counter--;
    }
  }

  if(!node->ends && !node->counter && node != root) {
    delete node;
    return true;
  }

  return false;
}

bool trieSearch(Trie*& node, int p) {
  if(!p) {
    return node->ends;
  }
  if(!node->next[p % 2])
    return 0;
  return trieSearch(node->next[p % 2], p / 2);
}

int n;

int main() {
  root = new Trie;

  freopen("hashuri.in", "r", stdin);
  freopen("hashuri.out", "w", stdout);
  scanf("%d ", &n);

  for (int i = 1; i <= n; i++) {
    int op, arg;
    scanf("%d %d ", &op, &arg);
    if (op == 1) trieInsert(root, arg);
    else if (op == 2) trieRemove(root, arg);
    else printf("%d\n", trieSearch(root, arg));
  }
  return 0;
}