Cod sursa(job #710013)

Utilizator mr.johnFMI - Laceanu Ionut-Adrian mr.john Data 8 martie 2012 19:46:37
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
//Laceanu Ionut-Adrian
//Double Hashing
//F.M.I., gr.135

#include <stdio.h>
#define MOD 1022467
#define MOD2 1022449

using namespace std;

int n;
int T[MOD];

inline int h(int x, int i){
	return (((x%MOD)+i*(1+x%MOD2))%MOD);     //functia de double-hashing
}

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;
}

void 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;                                            //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;
}

void 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;
		}
		if (T[temp]==0) return;
	}
}

int main(){
	unsigned int op,nr;
	freopen("hashuri.in","r",stdin);
	freopen("hashuri.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++){
		scanf("%d %d",&op,&nr);
		if (op==1){ insert(nr); continue;}
		if (op==2){ remove(nr); continue;}
		if (op==3) printf("%d\n",query(nr));
	}
	return 0;
}