Cod sursa(job #264656)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 22 februarie 2009 15:44:50
Problema Hashuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
#include<stdio.h>
#define infile "hashing.in"
#define outfile "hashing.out"
#define hmax 1000001
#define nmax 1000*1001
struct lista
	{
	int p,v; //pozitia si valoarea
	} l[nmax]; //numarul maxim de valori ce pot aparea in lista
int t[hmax]; //tabela hash, care retine pozitia de start a listei
int nr; //numarul ultimei valori din lista
int n; //numarul de operatii

//returneaza codul hash al lui x
int cod_hash(int x)
	{
	return x%hmax;
	}

//cauta valoarea x pt codul c
int cauta_hash(int c, int x)
	{
	int ul;
	for(ul=t[c];ul;ul=l[ul].p) //trecem pe la toate valorile listei
		if(l[ul].v==x) return ul; //am gasit, returnam pozitia la care am gasit-o
	return 0; //daca am ajuns aici, inseamna k nu am gasit
	}

//adauga valoarea x
void add_hash(int x)
	{
	int ul,c=cod_hash(x); //luam codul hash al lui x
	if(!cauta_hash(c,x)) //daca nu avem deja valoarea adaugata
		{
		l[++nr].p=t[c]; l[nr].v=x; t[c]=nr; //adaugam elementul in lista
		}
	}

//sterge valoarea x
void del_hash(int x)
	{
	int ul=cauta_hash(cod_hash(x),x); //primim pozitia daca se afla in lista, sau 0 in caz contrar
	if(ul) l[ul].v=0; //sa stim ca nu mai exista
	}

int main()
{
int o,x;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

scanf("%d\n",&n); //citim numarul de operatii
while(n--) //cat timp avem operatii de facut
	{
	scanf("%d %d\n",&o,&x); //citim operatia si valoarea
	if(o==1) add_hash(x); //trebuie sa il adaugam pe x
	else if(o==2) del_hash(x); //trebuie sters
	else if(cauta_hash(cod_hash(x),x)) printf("1\n"); else printf("0\n"); //trebuie sa afisam daca exista sau nu
	}


fclose(stdin);
fclose(stdout);
return 0;
}