Cod sursa(job #2752389)

Utilizator DordeDorde Matei Dorde Data 17 mai 2021 20:49:14
Problema Hashuri Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.25 kb
#include <bits/stdc++.h>
using namespace std;


void Resize (int *&V , int newm){
    delete V;
    V = new int [newm + 1];
    memset (V , 0 , 4 * newm);
}
class HashTable{
public:
    int *v , *flag , n = 0, m = 2;
    int p1 = (int)1e9 + 7 , p2 = 666013;
    int a1 , b1 , a2 , b2;
    mt19937 rand;
    bool isEmpty (){
        return n == 0;
    }
    int Size (){
        return n;
    }
    HashTable (){
        v = new int [m + 1];
        flag = new int [m + 1];
        memset (v , 0 , 4 * m);
        memset (flag , 0 , 4 * m);
        getvalues (a1 , b1 , a2 , b2);
    }
    void getvalues (int &a , int &b , int &c , int &d){
        uniform_int_distribution <int> m1 (1 , m);
        a = m1 (rand) , b = m1 (rand) , c = m1 (rand) , d = m1 (rand);
        return;
    }
    int h1 (int key){
        int val = (1LL * a1 * key + b1) % p1;
        return val;
    }
    int h2 (int key){
        int val = (1LL * a2 * key + b2) % p2;
        return val | 1;
    }
    int H (int key , int index){
        int x = h1 (key);
        int y = h2 (key);
        int val = (1LL * x + 1LL * index * y) % m + 1;
        return val;

    }
    int getpos (int key){
        int i = 1 , p = H (key , 1);
        while (flag [p] == 1){
            ++ i;
            p = H (key , i);
        }
        return p;
    }
    void dResize (){
        int cpm = m;
        if (n > m / 2)
            m = m * 2;
        else
            if (n <= m / 4)
                m = m / 2 ;
            else
                return;
        int *cp = new int [cpm] , *cp2 = new int [cpm];
        for(int i = 1 ; i <= cpm ; ++ i){
            cp [i] = v [i] , cp2 [i] = flag [i];
        }
        Resize (v , m) , Resize (flag , m);
        getvalues (a1 , b1 , a2 , b2);
        for(int i = 1 ; i <= cpm ; ++ i)
            if (cp2 [i] == 1){
                int p = getpos (cp [i]);
                v [p] = cp [i];
                flag [p] = 1;
            }
        delete cp ;
        delete cp2;
        return;
    }
    int findx (int key){
        int i = 1 , p = H (key , 1);
        while (flag [p] != 0 && i <= m){
            if (flag [p] == 1 && v [p] == key)
                return p;
            ++ i;
            p = H (key , i);
        }
        return 0;
    }
    void add (int key){
        if (findx (key) != 0)
            return;
        ++ n;
        int p = getpos (key);
        v [p] = key;
        flag [p] = 1;
        dResize ();
        return;
    }
    void Remove (int key){
        if (isEmpty ())
            return;
        int p = findx (key);
        if (p == 0)
            return;
        flag [p] = 2;
        -- n;
        dResize ();
    }
    bool is (int key){
        return findx (key) != 0;
    }
};
int main()
{
    freopen ("hashuri.in" , "r" , stdin);
    freopen ("hashuri.out" , "w" , stdout);
    HashTable Hash;
    int n;
    scanf ("%d" , &n);
    while (n --){
        int type , value;
        scanf ("%d%d" , &type , &value);
        if (type == 1)
            Hash.add (value);
        else
            if (type == 2)
                Hash.Remove (value);
            else
                printf ("%d\n" , Hash.is (value));
    }
    return 0;
}