Pagini recente » Cod sursa (job #2943646) | Cod sursa (job #276986) | Cod sursa (job #9022) | Cod sursa (job #2640508) | Cod sursa (job #714956)
Cod sursa(job #714956)
//Laceanu Ionut-Adrian
//Double Hashing
//F.M.I., gr.135
#include <stdio.h>
#define MOD 1022467
#define MOD2 1022449
using namespace std;
class hash{
int T[MOD];
int h(int x, int i){
return (((x%MOD)+i*(1+x%MOD2))%MOD); //functia de double-hashing
}
public:
int query(int x){
int t;
for(int i=0;;i++){
t=h(x,i); //self-explanatory
if (T[t]==0) return 0;
if (T[t]==x) return 1;
}
return 0;
}
int insert(int x){
int i,temp,j;
for (i=0;temp=h(x,i), (T[temp]!=0&&T[temp]!=x)&&(i<MOD2); i++); //parcurgem tabela pana gasim
if (T[temp]) return -1; //gasim elementul sau o pozitie
for (j=0;(T[h(x,j)]>0);j++); //libera, unde il vom insera.
T[h(x,j)]=x;
return h(x,j);
}
int remove(int x){
int temp;
for(int i=0;;i++){ //parcurgem tabela pana cand fie gasim elementul, pe care il inlocuim cu -1
temp=h(x,i); //fie gasim elementul 0, ceea ce inseamna ca elementul nu se afla in tabela.
if (T[temp]==x){
T[temp]=-1;
return temp;
}
if (T[temp]==0) return -1;
}
}
};
int main(){
int n;
hash has;
unsigned int op,nr;
freopen("hashuri.in","r",stdin);
freopen("hashuri.out","w",stdout);
scanf("%d",&n);
for (register int i=1;i<=n;i++){
scanf("%d %d",&op,&nr);
if (op==1){ has.insert(nr); continue;}
if (op==2){ has.remove(nr); continue;}
if (op==3) printf("%d\n",has.query(nr));
}
return 0;
}