Cod sursa(job #1700259)

Utilizator stoianmihailStoian Mihail stoianmihail Data 9 mai 2016 22:18:36
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<bits/stdc++.h>
struct trie{
  int count,fii;
  trie *c[2];
  trie(){
    count=fii=0;
    memset(c,NULL,sizeof(c));
  }
};
int x;
trie*root=new trie;
int da(int b){
  return (x>>b)&1;
}
void insert(trie*nod,int bit){
  if(bit==-1){
    nod->count=1;
    return;
  }
  if(nod->c[da(bit)]==NULL){
    nod->c[da(bit)]=new trie;
    nod->fii++;
  }
  insert(nod->c[da(bit)],bit-1);
}
int erase(trie*nod,int bit){
  if(bit==-1){
    nod->count=0;
  }else if(erase(nod->c[da(bit)],bit-1)){
    nod->fii--;
    nod->c[da(bit)]=NULL;
  }
  if(nod!=root&&nod->count==0&&nod->fii==0){
    delete nod;
    return 1;
  }
  return 0;
}
int find(trie*nod,int bit){
  if(bit==-1){
    return nod->count;
  }
  return nod->c[da(bit)]==NULL?0:find(nod->c[da(bit)],bit-1);
}
int main(void){
  FILE*f=fopen("hashuri.in","r");
  freopen("hashuri.out","w",stdout);
  int N,task;
  fscanf(f,"%d",&N);
  while(N){
    fscanf(f,"%d%d",&task,&x);
    if(task==1){
      insert(root,30);
    }else if(task==2){
      if(find(root,30)){
        erase(root,30);
      }
    }else{
      fprintf(stdout,"%d\n",find(root,30));
    }
    N--;
  }
  fclose(f);
  fclose(stdout);

  ///Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}