Cod sursa(job #714956)

Utilizator mr.johnFMI - Laceanu Ionut-Adrian mr.john Data 16 martie 2012 13:11:20
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
//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;
}