Cod sursa(job #1451023)

Utilizator smallOneAdina Mateescu smallOne Data 15 iunie 2015 19:23:22
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <string>
#include <ctime>
#include <cassert>
#include <utility>

using namespace std;

// ideea la hashuri este ca se asociaza fiecarei cheie, o valoarea unica sau cel putin daca nu e injectiva (unu la unu) atunci am un vector de
// MOD elemente in care fiecare e o lista cu elementele care dau x % MOD acel numar 
// cand P este destul de mare aproape de N atunci elementele se impart uniform si atunci cand cauti intr-o lista din cele MOD nu cauti mult
// deci obtii rasp la cautare / adaugare / stergere in aproape O(1)
// ca MOD SE ALEGE DE OBICEI UN NUMAR PRIM MARE atat cat iti permite restrictia de memorie sa folosesti.

#define MOD 666013

int x, n, op;
vector<int> hashtable[MOD];

vector<int>::iterator gaseste_pos(int x) {
    int m = x % MOD;
    for(vector<int>::iterator it = hashtable[m].begin(); it != hashtable[m].end(); it++) {
        if(*it == x) {
            return it; // returnez pozitia unde am gasit valoarea cautata
        }
    }
    return hashtable[m].end(); // nu am gasit nodul
}

bool exista(int x) {
    if(gaseste_pos(x) != hashtable[x % MOD].end()) {
        return true;
    }
    return false;
}

void adauga(int x) {
    int m = x % MOD;
    if(gaseste_pos(x) == hashtable[m].end()) {
        hashtable[m].push_back(x);
    }
}

void sterge(int x) {
    vector<int>::iterator it = gaseste_pos(x);
    int m = x % MOD;
    if(it != hashtable[m].end()) { // a fost gasit in hash map
        hashtable[m].erase(it);
    }
}

int main() {
	freopen("hashuri.in", "r", stdin);
	freopen("hashuri.out","w", stdout);
	
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
        scanf("%d %d", &op, &x);
        switch(op) {
            case 1: 
                adauga(x);
                break;
            case 2:
                sterge(x);
                break;
            case 3: 
                printf("%d\n", exista(x));
                break;
        }
	}
	
	return 0;
}