Pagini recente » Cod sursa (job #78430) | Cod sursa (job #2222860) | Cod sursa (job #1382350) | Cod sursa (job #1621950) | Cod sursa (job #264656)
Cod sursa(job #264656)
#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;
}