Cod sursa(job #1564123)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 8 ianuarie 2016 15:25:55
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>

#define NMax 1000010
#define MOD 666013

using namespace std;

ifstream f("hashuri.in");
ofstream g("hashuri.out");

int queries, hashTable[NMax];

int hashFunction(int val)
{
	int h = 0, g;
	while (val != 0) {
		h = (h << 4) + val % 10;
		val /= 10;

		if (g = h & 0xF0000000)
			h ^= g >> 24;

		h &= ~g;
	}
	return h % MOD;
}

bool hashFind(int val)
{
	int key = hashFunction(val), inc = 1;

	while (hashTable[key] != val && inc < NMax) { //cand ma opresc
		key = (key + inc) % NMax;
		inc++;
	}

	if (inc == NMax)
		return false;
	return true;
}

void insertHash(int val)
{
	int key = hashFunction(val), inc = 1;

	if (!hashFind(val)) {
		while (hashTable[key] != 0 && inc < NMax) {
			key = (key + inc) % NMax;
			inc++;
		}

		hashTable[key] = val;
	}
}

void deleteHash(int val)
{
	int key = hashFunction(val), inc = 1;

	if (hashFind(val)) {
		while (hashTable[key] != val && inc < NMax) {
			key = (key + inc) % NMax;
			inc++;
		}
		hashTable[key] = 0;
	}
}

int main()
{
	f >> queries;

	int op, elem;
	for (int i = 1; i <= queries; i++) {
		f >> op >> elem;

		if (op == 1) {
			insertHash(elem);
		}
		else if (op == 2) {
			deleteHash(elem);
		}
		else {
			if (hashFind(elem))
				g << "1\n";
			else
				g << "0\n";
		}
	}
}