Cod sursa(job #1756084)

Utilizator sulzandreiandrei sulzandrei Data 11 septembrie 2016 20:24:40
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.4 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <ctime>
#include <cstdlib>
#include <fstream>
using namespace std;
#define ll long long int
#define pb push_back
ifstream in ("hashuri.in");
ofstream out("hashuri.out");
///////////////////////////////
///////////
///////////         Hashuri diviziune
///////////
//////////////////////////////
const int M  =195931;
const float A = 0.6180339887;
vector<int> v[M];

const int maxByte = ( 1 << 8 )-1;
const int byteNr = sizeof(int);
int getRandom()
{
    srand (time(NULL));
    return rand()%M;
}
int getIthByte(int &n,int &i)
{
    return  ( n >> ( i * 8) ) & maxByte;
}
int getSum(int &x)
{
    int hx = 0;
    for(int i = 0 ; i < byteNr; i++)
        hx += ( getRandom() * getIthByte(x,i) % M);
}
int H(int k )
{

    return getSum(k);
    //return trunc(M*fmod(k*A,1));                    //metoda inmultirii
    //return k % M;                                   //metoda diviziunii
}

void add(int &e)//adaugam elementul in multime
{
    int hx = H(e);
    if ( find(v[ hx ].begin(),v[hx].end(),e) != v[ hx].end())
        return;
    v[ hx ].pb(e);
}
void erase(int &e)//stergem elementul din multime
{
    int hx = H(e);
    if (find(v[ hx  ].begin(),v[hx ].end(),e) != v[ hx ].end())
        v[ hx ].erase(find(v[ hx  ].begin(),v[hx ].end(),e));
}
int find(int e)//returnam 1 daca este in multime sau 0 altfel
{
    int hx = H(e);
    if (find(v[ hx  ].begin(),v[hx ].end(),e) !=v[hx ].end())
        return 1;
    return 0;
}
///////////////////////////////
///////////
///////////         Arbori binari de cautari echilibirati log(n) -pe operatie
///////////
//////////////////////////////
unordered_set<int> tree;
void addTree(int x)
{
    tree.insert(x);
}
void removeTree(int x)
{
    tree.erase(x);
}
int isInTree(int x)
{
    return (tree.find(x) !=tree.end())?1:0;
}
int main()
{
    int n,x,op;
    in >> n;
    for(int i = 0 ; i < n ; i++)
    {
        in >> op >> x;
        switch(op)
        {
            case 1:
                add(x);
                //addTree(x);
             break;
            case 2:
                erase(x);
                //removeTree(x);
            break;
            case 3:
                out<<find(x)<<'\n' ;
                //out<<isInTree(x)<<'\n';
            break;
        }
    }
    return 0;
}