Cod sursa(job #894900)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 27 februarie 2013 01:00:25
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include<cstdio>
#include<bitset>

using namespace std;

struct Hash_Table {
    int hash_size, *H;

    void create(int dim) {
        int i, j, lim;
        bool *prim;
        dim*=4;
        prim = new bool[dim+1];
        fill(prim, prim+dim+1, false);
        for(i=4; i<=dim; i*=2)
            prim[i] = 1;
        lim = 2;
        for(i=3; i<=dim; i+=2) {
            if(!prim[i]) {
                lim = i;
                for(j=i*2; j<=dim; j+=i)
                    prim[j] = 1;
            }
        }
        hash_size = lim;
        H = new int[hash_size+1];
        fill(H, H+hash_size+1, 0);
    }

    int hash1(int val) {
        return val % hash_size;
    }

    int hash2(int val) {
        return (val % (hash_size - 1)) + 1;
    }

    int hash_key(int val, int poz) {
        return (hash1(val) + poz * hash2(val)) % hash_size;
    }

    int find(int val) {
        int i, j;

        for(i=0; i<hash_size; ++i) {
            j = hash_key(val, i);
            if(H[j] == val)
                return j;
            if(H[j] == NULL)
                return -1;
        }

        return -1;
    }

    void insert(int val) {
        if(find(val) != -1)
            return;

        int i, j;

        for(i=0; i<hash_size; ++i) {
            j = hash_key(val, i);
            if(H[j] == NULL || H[j] == -1) {
                H[j] = val;
                return;
            }
        }
    }

    void erase(int val) {
        int poz = find(val);

        if(poz == -1)
            return;
        else
            H[poz] = -1;
    }
};


int main() {

    freopen("hashuri.in","r",stdin);
    freopen("hashuri.out","w",stdout);

    int T, op, x;

    Hash_Table myHash;

    scanf("%d",&T);
    myHash.create(T);
    while(T--) {
        scanf("%d %d",&op,&x);
        if(op == 1)
            myHash.insert(x);
        if(op == 2)
            myHash.erase(x);
        if(op == 3) {
            if(myHash.find(x) != -1)
                printf("1\n");
            else
                printf("0\n");
        }
    }

    return 0;
}