Cod sursa(job #804097)

Utilizator robert_dDragan Robert robert_d Data 28 octombrie 2012 20:54:58
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <time.h>

using namespace std;
#define HT 1
//int sizes[] = {70157, 20173, 300151, 100003}; // 1.1
//int sizes[] = {20011, 20021, 20029, 20047, 20051}; // 1.35
//int sizes[] = {50021, 50023}; // 0.78
//int sizes[] = {300151, 100003}; // 0.73
//int sizes[] = {666013, 300151, 100003}; // 0.83
//int sizes[] = {666013, 300151}; // 0.67
int sizes[] = {666013, 700211}; // 0.66
//int sizes[] = {500009, 371027}; // 0.67
//int sizes[] = {500009, 666013}; // 0.67
//int sizes[] = {666013, 100003}; // 0.68
//int sizes[] = {666013}; // 0.54

vector<vector <int> >  H[HT];

struct ht_pointer {
	vector<int> * list;
	vector<int>::iterator it;
	bool valid;
};

void init_tables() {
	for (int i=0; i<HT; ++i) {
		H[i].resize(sizes[i]);
		for (int j=0; j<H[i].size(); ++j)
			H[i][j] = vector<int>();
	}
}

void print_tables() {
	for (int i; i<HT; ++i) {
		cout << "HT " << i << " : ";
		for (int j=0; j<sizes[i]; ++j) {
			cout << "[";
			for (int k=0; k<H[i][j].size(); ++k) {
				cout << H[i][j][k] << ",";
			}
			cout << "],";
		}
		cout << "\n";
	}
	cout << "--------\n";
}

void print_list(vector<int> * list) {
	cout << "\nLIST:: [";
	for (int i=0; i<list->size(); ++i) {
		cout << list->at(i) << ",";
	}
	cout << "]\n";
}

vector<int>::iterator find_in_list(vector<int> * list, int x) {
	/* Find the value x in the list. */
	vector<int>::iterator it;
	for (it = list->begin(); it != list->end(); ++it)
		if (*it == x) return it;
	return list->end();
}

ht_pointer find(int x) {
	/* Finds integer x in the hash tables. */
	for(int i=0; i<HT; ++i) {
		vector<int> * list = &H[i][x % sizes[i]];
		vector<int>::iterator it = find_in_list(list,x);
		if (it != list->end()) {
			ht_pointer htp = {list, it, true};
			return htp;
		}
	}
	ht_pointer htp;
	htp.valid = false;
	return htp;
}

void add(int x) {
	/* Adds integer x into the shortest  hash table list. */
	ht_pointer htp = find(x);
	if (!htp.valid) {
		// find shortest hash table list
		vector<int> * sh_list = &H[0][x % sizes[0]];
		for(int i=1; i<HT; ++i) {
			vector<int> * list = &H[i][x % sizes[i]];
			if (list->size() < sh_list->size()) {
				sh_list = list;
			}
		}
		// insert
		sh_list->push_back(x);
	}
}

void remove(int x) {
	/* Removes integer x from the hash tables. */
	ht_pointer htp = find(x);
	if (htp.valid) {
		*htp.it = htp.list->back();
		htp.list->pop_back();
	}
}

int main() {
	freopen("hashuri.in","r",stdin);
    freopen("hashuri.out","w",stdout);
    int n, op, val;
    init_tables();
    scanf("%d", &n);
	clock_t begin = clock();
	for (;n;--n) {
		scanf("%d %d", &op, &val);
		//cout << "@ " << op << " " << val << "\n"; 
		if (op == 1) {
			add(val);
		} else if (op == 2) {
			remove(val);
		} else {
			printf("%d\n", find(val).valid == true);
		}
		// debug
		//print_tables();
	}
	clock_t end = clock();
    cout << "Running time: " << double(end-begin) / CLOCKS_PER_SEC;
	return 0;
}