Cod sursa(job #894876)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 27 februarie 2013 00:39:12
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<stdio.h>
#include<stdlib.h>

struct Hash_Table {
    int hash_size, *H;

    void create() {
        int i, j;
        hash_size = 666013;
        H = (int*)malloc(666013);
    }

    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;
    myHash.create();

    scanf("%d",&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;
}