Cod sursa(job #1173313)

Utilizator mihai995mihai995 mihai995 Data 19 aprilie 2014 09:13:02
Problema Hashuri Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.17 kb
#include <fstream>
#include <cstdlib>
using namespace std;

const int nil = 0x3f3f3f3f;
const double maxLoadFactor = 0.7;

class HashTable{
    int* hash;
    int size, cap, mod;

    template<class Type>
    inline static void swap(Type& a, Type& b){
        Type c = a;
        a = b;
        b = c;
    }

    inline static bool prime(int x){
        int i = 2;
        while ( i * i <= x && x % i )
            i++;
        return i * i > x;
    }

    inline static int nextPrime(int x){
        return prime(x) ? x : nextPrime(x + 1);
    }

    int lookup(int x){
        if ( maxLoadFactor * cap < size ){
            HashTable H( cap << 1, mod << 1 );
            for (int i = 0 ; i < cap ; i++)
                if ( hash[i] && hash[i] != nil )
                    H.insert( hash[i] );
            swap(H, *this);
        }

        int poz = x % cap, step = 1 + x % mod;

        while ( hash[poz] && hash[poz] != x )
            poz = (poz + step) % cap;

        return poz;
    }
public:
    HashTable(){
        hash = (int*)calloc(7, sizeof(int));
        cap = 7;
        mod = 3;
        size = 0;
    }

    HashTable(int n, int m){
        hash = (int*)calloc(n, sizeof(int));
        cap = nextPrime(n);
        mod = nextPrime(m);
        size = 0;
    }

    void insert(int x){
        int poz = lookup(x);
        if ( hash[poz] != x ){
            hash[poz] = x;
            size++;
        }
    }

    bool contains(int x){
        int poz = lookup(x);
        return hash[poz] == x;
    }

    void erase(int x){
        int poz = lookup(x);
        if (hash[poz] == x){
            hash[poz] = nil;
            size--;
        }
    }

    ~HashTable(){
        free(hash);
    }
};

int main(){
    int times, tip, x;
    HashTable H;

    ifstream in("hashuri.in");
    ofstream out("hashuri.out");

    in >> times;
    while (times--){
        in >> tip >> x;

        if (tip == 1)
            H.insert(x);
        if (tip == 2)
            H.erase(x);
        if (tip == 3)
            out << H.contains(x) << '\n';
    }

    in.close();
    out.close();

    return 0;
}