Cod sursa(job #1503484)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 16 octombrie 2015 11:50:53
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 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 = 666013;
const int M2 = 815555;

int N;

vector<int> h1[M1 + 1];
vector<int> h2[M2 + 1];


void adauga(int x) {

	int value1 = x % M1;
	int value2 = x % M2;

	if(h1[value1].size() > h2[value2].size())
		h2[value2].push_back(x);	
			else 
		h1[value1].push_back(x);
}

void sterge(int x) {

	int value1 = x % M1;
	int value2 = x % M2;

	for(unsigned i = 0 ; i < h1[value1].size() ; ++i)
		if(h1[value1][i] == x) {

			swap(h1[value1][i], h1[value1][ h1[value1].size() - 1 ]);
			h1[value1].pop_back();
			return ;
		}

	for(unsigned i = 0; i < h2[value2].size() ; ++i)
		if(h2[value2][i] == x) {

			swap(h2[value2][i], h2[value2][ h2[value2].size() - 1 ]);
			h2[value2].pop_back();
			
			return;
		}
}

int interogare(int x) {

	int value1 = x % M1;
	int value2 = x % M2;

	for(unsigned i = 0; i < h1[value1].size() ; ++i)
		if(h1[value1][i] == x) 
			return 1;

	for(unsigned i = 0; i < h2[value2].size() ; ++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;
}