Cod sursa(job #1503429)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 16 octombrie 2015 03:36:54
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
/*
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][6];
int h2[M2 + 1][6]; // 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;
}