Cod sursa(job #711547)
/*
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;
}