Cod sursa(job #917891)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 18 martie 2013 14:01:19
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.77 kb
#include <fstream>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#define prim2 251003
#define prim1 350107
#define sizet1 670000
#define sizet2 400000
#define maxim 1000000

using namespace std;

class CuckooHash
{
private:
    int random1,random2,nr;
    int *T1,*T2;
    int *ope;
    int *values;
    int h1(int, int);
    void rehash();

public :
    CuckooHash();
    bool adauga(int x);
    int  cauta(int x);
    bool sterge (int x);

};

CuckooHash :: CuckooHash()
{

    srand(time(NULL));
    random1=prim1 +rand() % (sizet1-prim1);
    random2=prim2 +rand() % (sizet2-prim2);
    nr=0;
    T1= new int[sizet1+2];
    T2= new int[sizet2+2];
    ope=new int[maxim];
    values=new int[maxim];

}

int CuckooHash :: h1(int value,int random){return value %random;}

void CuckooHash :: rehash()
{
    delete T1;
    delete T2;

    random1=prim1 +rand() % (sizet1-prim1);
    random2=prim2 +rand() % (sizet2-prim2);

    T1=new int[sizet1+2];
    T2=new int[sizet2+2];

    for (int i=0;i<nr;i++)
     if (ope[i]==true) adauga(values[i]);
                 else  sterge(values[i]);
}

int CuckooHash :: cauta(int value)
{
    int hash1=h1(value,random1);
    int hash2=h1(value,random2);
    if (T1[hash1]==value || T2[hash2]==value) return 1;
                                         else return 0;
}

bool CuckooHash :: sterge(int value)
{
    ope[nr]=false;
    values[nr++]=value;

    int hash1=h1(value,random1);
    int hash2=h1(value,random2);

    if (T1[hash1]==value){
        T1[hash1]=0;
        return true;
    }
    if (T2[hash2]==value){
        T2[hash2]=0;
        return true;
    }
    return false;
}

bool CuckooHash :: adauga(int value)
{
    bool ok=false;
    int aux;

    int hash1 = h1(value,random1);
    int hash2 = h1(value,random2);

    ope[nr]=true;
    values[nr++]=value;

    if (cauta(value)==0)
{
    for(int i=1;i<=50;i++)
    {
        if(T1[hash1]==0){
            T1[hash1]=value;
            return true;
        }
        else
        if(T2[hash2]==0){
            T2[hash2]=value;
            return true;
        }
        else{
            aux=T2[hash2];
            T2[hash2]=value;
            value=aux;
        }
    }
    if (ok==false) rehash();
}
}

int main()
{
    ifstream in("hashuri.in");
    ofstream out("hashuri.out");
    int n;
    in>>n;
    CuckooHash Hashul;
    for (int i=0;i<n;i++)
    {
        int op,val;
        in>>op>>val;
        switch(op)
        {
            case 1: Hashul.adauga(val);

                    break;
            case 2: Hashul.sterge(val);

                    break;
            case 3: out<<Hashul.cauta(val)<<'\n';

                    break;
        }
    }
    return 0;
}