Cod sursa(job #710670)

Utilizator DraStiKDragos Oprica DraStiK Data 10 martie 2012 16:07:26
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.78 kb
#include <cassert>
#include <cstring>
#include <cstdio>
using namespace std;

#define DEL -1
#define NIL 0

int get_prime (int N) {
  bool *tmp;
  int i,j,prime;

  tmp=new bool[N+1];
  for (i=0; i<=N; ++i)
    tmp[i]=0;

  prime=2;
  for (i=2; i<=N; ++i)
    if (!tmp[i]) {
      prime=i;

      for (j=i; j<=N; j+=i)
        tmp[j]=1;
    }
  delete[] tmp;

  return prime;
}

class hash_table {

  int hash_size,hash_used,hash_prime;
  int *T;

  int h1 (int);
  int h2 (int);
  int h (int,int);

  public:
  hash_table () {
    int i;

    this->hash_size=1000003;
    this->T=new int[this->hash_size];
    for (i=0; i<this->hash_size; ++i)
      this->T[i]=NIL;
  }

  void rehash ();
  void insert (int);
  void erase (int);
  int find (int);
};

int hash_table :: h1 (int key) {
  return key%this->hash_size;
}

int hash_table :: h2 (int key) {
  return 1+key%(this->hash_size-1);
}

int hash_table :: h (int key,int poz) {

    return (this->h1 (key)+poz*this->h2 (key))%this->hash_size;
}

void hash_table :: insert (int key) {
  int i,j,is;

  is=this->find (key);
  if (is)
    return ;

  for (i=0; i<this->hash_size; ++i) {

    j=this->h (key,i);
    if (this->T[j]==NIL || this->T[j]==DEL) {

      this->T[j]=key;

//      if (++this->hash_used==this->hash_size)
//        this->rehash ();

      return ;
    }
  }
}

void hash_table :: erase (int key) {
  int is;

  is=this->find (key);
  if (!is)
    return ;

  --this->hash_used;
  this->T[is]=DEL;
}

int hash_table :: find (int key) {
  int i,j;

  for (i=0; i<this->hash_size; ++i) {

      j=this->h (key,i);
      if (this->T[j]==key)
        return j;

      if (this->T[j]==NIL)
        return 0;
  }

  return 0;
}

//void hash_table :: rehash () {
//  int *tmp;
//  int i,N;
//
//  N=0;
//
//  tmp=new int[this->hash_size];
//  for (i=0; i<this->hash_size; ++i)
//    if (this->T[i]!=NIL && this->T[i]!=DEL)
//      tmp[N++]=this->T[i];
//
//  delete[] this->T;
//  this->hash_used=0;
//  this->hash_size=get_prime (this->hash_size<<1);
//  this->T=new int[this->hash_size];
//  for (i=0; i<this->hash_size; ++i)
//    this->T[i]=0;
//
//  for (i=0; i<N; ++i)
//    this->insert (tmp[i]);
//  delete[] tmp;
//}

//END OF CLASS DECLARATION

hash_table Hash;
int T;

int main () {
  assert (freopen ("hashuri.in","r",stdin));
  assert (freopen ("hashuri.out","w",stdout));

  int i,x,tip;

  assert (scanf ("%d",&T));
  for (i=1; i<=T; ++i) {

    assert (scanf ("%d%d",&tip,&x));

    if (tip==1)
        Hash.insert (x);

    if (tip==2)
        Hash.erase (x);

    if (tip==3) {

      if (Hash.find (x))
        printf ("1\n");
      else
        printf ("0\n");
    }
  }

  return 0;
}