Pagini recente » Cod sursa (job #2563069) | Cod sursa (job #2742511) | Cod sursa (job #1637440) | Cod sursa (job #2404332) | Cod sursa (job #907479)
Cod sursa(job #907479)
#include <fstream>
#include <iostream>
#include <ctime>
#include <stdlib.h>
#define prim2 251003
#define prim1 350107
#define sizet1 670000
#define sizet2 400000
using namespace std;
int random1,random2,nr;
int h1(int &value,int random)
{
return value%random;
}
int find_it(int value,int *T1, int *T2 )
{
int hash1=h1(value,random1);
int hash2=h1(value,random2);
if (T1[hash1]==value || T2[hash2]==value)
return 1;
else return 0;
}
bool erase_it(int value,int *T1,int *T2)
{
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 insert_it(int value, int *T1, int *T2)
{
int aux;
int hash1 = h1(value,random1);
int hash2 = h1(value,random2);
if (find_it(value,T1,T2))
return true;// ed eja in hash
bool place = 1;
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;
}
}
return false;
}
void rehash(int *T1, int *T2,int *ope, int *values)
{
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)
insert_it(values[i],T1,T2);
else
erase_it(values[i],T1,T2);
}
}
int main()
{ int n,op,i,x;
srand(time(NULL));
random1=prim1 +rand() % (sizet1-prim1);
random2=prim2 +rand() % (sizet2-prim2);
ifstream in("hashuri.in");
ofstream out("hashuri.out");
in>>n;
int *T1= new int[sizet1+2];
int *T2= new int[sizet2+2];
int *ope=new int[n];
int *values=new int[n];
// iau vectorul op daca operatia e de adaugare op[i]=true else daca e de sterge op[i]=false;
for (i=0;i<n;i++)
{
in>>op;
if (op==1)
{
in>>x;
ope[nr]=true;
values[nr++]=x;
if (insert_it(x,T1,T2)==false)
rehash(T1,T2,ope,values);
}
else
if (op==2)
{
in>>x;
ope[nr]=false;
values[nr++]=x;
int ok1=erase_it(x,T1,T2);
}
else
{
in>>x;
out<<find_it(x,T1,T2)<<'\n';
}
}
return 0;
}