Cod sursa(job #711547)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 12 martie 2012 12:34:17
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
/*
hash: open adressing, cuckoo hashing
*/
#include <stdio.h>

using namespace std;
#define PRIM1 951427
#define PRIM2 853339
//2^20>1000000
//doua numere prime mari, cu suma~ 2n

int hashul1[PRIM1+1];//sunt globale, deci initial sunt 0; cand un slot e 0, e gol
int hashul2[PRIM2+1];

inline int hash1(int k){
  return k%PRIM1;
}

inline int hash2(int k){
  return k%PRIM2;
}

bool e_in_hash(int p){
    if(hashul1[hash1(p)]==p || hashul2[hash2(p)]==p)return 1;
    return 0;
}

void sterge(int p){    
    int aux;
    aux=hash1(p);
    if(hashul1[aux]==p){hashul1[aux]=0;return;}

    aux=hash2(p);
    if(hashul2[aux]==p){hashul2[aux]=0;return;}
}

void insert(int x,int ciclare){
     //incerc sa-l bag intr-un hash
     if(ciclare==1000){printf("prea multe relocari\n");return;}
     int aux,y,z;
     aux=hash1(x);
     if(hashul1[aux]==0){hashul1[aux]=x;return;}
         else{//e cineva deja in primul hash (este y)
           //il iau si il tin minte
           y=hashul1[aux];
           //pt x il bag in hashul1
           hashul1[aux]=x;
           //pe y incerc sa-l duc in alta parte; acum el e unde i-a spus hash1(y) sa fie
           aux=hash2(y);
           if(hashul2[aux]==0){hashul2[aux]=y;}
              else{
                //printf("eroare! nu mai am loc\n");return;
                z=hashul2[aux];
                hashul2[aux]=y;
                insert(z,ciclare+1);//voi vrea sa-i gasesc lui z un alt loc, incepand sa caut in hashul1
                //il pun in primul slot
              }
                    
         }
}

int main(){
   int n;
   int i;
   FILE *fin=fopen("hashuri.in","r");
   int op,par;
   int aux;
   FILE *fout=fopen("hashuri.out","w");
   fscanf(fin,"%d",&n);
   for(i=0;i<n;i++){
       fscanf(fin,"%d%d",&op,&par);
       switch(op){
         case 1: //adaug x-ul, daca nu e deja
                if(!e_in_hash(par)){
                   insert(par,0);
                }
            break;
         case 2:
               //sterg elem x, daca exista
               sterge(par);    
            break;
         case 3://caut x
              if(e_in_hash(par)){
                  fprintf(fout,"1\n");
              }else fprintf(fout,"0\n");
       }
   }
   fclose(fout);
return 0;
}