Pagini recente » Cod sursa (job #2351718) | Template | Cod sursa (job #164837) | Cod sursa (job #2142155) | Cod sursa (job #1503428)
/*
Vom avea 2 tabele, fiecare cu propria ei functie de hash, iar coliziunile le rezolvam prin inlantuire;
cand inseram un element, il vom adauga in tabela in care intra intr-un lant mai scurt.
Cautarea se face in ambele tabele in locatiile returnate de cele 2 functii de hash; stergerea la fel.
Astfel, lungimea celui mai lung lant va fi, in medie, lg(lg(N)).
Dar, in practica, lungimea unui astfel de lant nu va depasi 4 elemente,
pentru ca cel mai mic N pentru care lg(lg(N)) = 5 este 232 ~ 4.000.000.000!!!
Deci, in loc de liste folosim vectori statici de dimensiune 4.
*/
#include <fstream>
#include <vector>
using namespace std;
const int NMAX = 1000001;
const int M1 = 166013;
const int M2 = 115555;
int N;
int h1[M1 + 1][5];
int h2[M2 + 1][5]; // primul indice reprezinta nr de elemente din inlantuire
void adauga(int x) {
int value1 = x % M1;
int value2 = x % M2;
if(h1[value1][0] > h2[value2][0])
h2[value2][ ++h2[value2][0] ] = x;
else
h1[value1][ ++h1[value1][0] ] = x;
}
void sterge(int x) {
int value1 = x % M1;
int value2 = x % M2;
for(int i = 1; i <= h1[value1][0] ; ++i)
if(h1[value1][i] == x) {
swap(h1[value1][i], h1[value1][ h1[value1][0]-- ]);
return ;
}
for(int i = 1; i <= h2[value2][0] ; ++i)
if(h2[value2][i] == x) {
swap(h2[value2][i], h2[value2][ h2[value2][0]-- ]);
return;
}
}
int interogare(int x) {
int value1 = x % M1;
int value2 = x % M2;
for(int i = 1; i <= h1[value1][0] ; ++i)
if(h1[value1][i] == x)
return 1;
for(int i = 1; i <= h2[value2][0] ; ++i)
if(h2[value2][i] == x)
return 1;
return 0;
}
int main() {
ifstream fin ("hashuri.in");
ofstream fout ("hashuri.out");
fin >> N;
while(N--) {
int type; int x;
fin >> type >> x;
switch(type) {
case 1: adauga(x); break;
case 2: sterge(x); break;
case 3: fout << interogare(x) << '\n'; break;
}
}
return 0;
}