Pagini recente » Cod sursa (job #2264611) | Cod sursa (job #85256) | Cod sursa (job #2315620) | Cod sursa (job #3180785) | Cod sursa (job #804102)
Cod sursa(job #804102)
#include <iostream>
#include <fstream>
#include <vector>
//#include <time.h>
using namespace std;
#define HT 2
//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;
}