Cod sursa(job #917880)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 18 martie 2013 13:52:42
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.82 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()
{
    nr=0;
    srand(time(NULL));
    random1=prim1 +rand() % (sizet1-prim1);
    random2=prim2 +rand() % (sizet2-prim2);
    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)
{
    ope[nr]=true;

    values[nr++]=value;

    int aux;
    bool ok=false;
    int hash1 = h1(value,random1);
    int hash2 = h1(value,random2);
    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()
{   int n;

    ifstream in("hashuri.in");
    ofstream out("hashuri.out");
    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;
}