Pagini recente » Cod sursa (job #1061398) | Cod sursa (job #3241418) | Cod sursa (job #1098203) | Cod sursa (job #1497716) | Cod sursa (job #917895)
Cod sursa(job #917895)
#include <fstream>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#define prim2 251003
#define prim1 350107
#define sizet1 670000
#define sizet2 400000
#define maxim 10000000
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;
}