Cod sursa(job #1243745)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 16 octombrie 2014 12:37:43
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

class LinearProbing
{
public:

    LinearProbing()
    {
        data = new int[PW];

        for ( int i = 0; i < PW; ++i )
            data[i] = EMPTY;
    }

    ~LinearProbing()
    {
        delete [] data;
    }

    void insert( const int value )
    {
        for ( int i = ( ( value & MOD ) * PRIME ) & MOD; ; i = ( i + 1 ) & MOD )
        {
            if ( data[i] == EMPTY || data[i] == ERASED )
            {
                data[i] = value;
                break;
            }
        }
    }

    void erase( const int value )
    {
        for ( int i = ( ( value & MOD ) * PRIME ) & MOD; data[i] != EMPTY; i = ( i + 1 ) & MOD )
        {
            if ( data[i] == value )
            {
                data[i] = ERASED;
                break;
            }
        }
    }

    bool find( const int value ) const
    {
        for ( int i = ( ( value & MOD ) * PRIME ) & MOD; data[i] != EMPTY; i = ( i + 1 ) & MOD )
        {
            if ( data[i] == value )
                return true;
        }

        return false;
    }

private:

    static const int PW = ( 1 << 21 );
    static const int MOD = PW - 1;
    static const int PRIME = 97;

    static const int EMPTY = -1;
    static const int ERASED = -2;

    int *data;
};

int main()
{
    ifstream in("hashuri.in");
    ofstream out("hashuri.out");

    int N, type, key;

    in >> N;

    LinearProbing T;

    for ( int k = 0; k < N; ++k )
    {
        in >> type >> key;

        if ( type == 1 )
            T.insert(key);

        if ( type == 2 )
           T.erase(key);

        if ( type == 3 )
          out << T.find(key) << "\n";
    }

    return 0;
}