Pagini recente » Cod sursa (job #110447) | Cod sursa (job #3072287) | Cod sursa (job #1083371) | Cod sursa (job #2492319) | Cod sursa (job #915213)
Cod sursa(job #915213)
#include<fstream>
#include<cmath>
#include<algorithm>
using namespace std;
double log2( double n)
{
return log(n)/log(2);
}
class Hash
{
int *filled1,*filled2;
long long q1,q2;
int size;
int *Hash1, *Hash2;
int place1(int a)
{
long long PRIM = 1000000009;
return ( (q1*(long long )a+(long long)q2)%PRIM%(long long )size);
}
int place2(int a)
{
long long PRIM = 1000000009;
return((q2*(long long)a+(long long)q1)%PRIM%(long long )size);
}
void function()
{
q1=rand()%size;
q2=rand()%size;
}
public:
Hash(){}
Hash ( int b)
{
function();
size=b;
Hash1= new int[size];
Hash2= new int[size];
for (int i=0;i<size;i++)
Hash1[i]=Hash2[i]=0;
filled1=new int [size];
filled2=new int [size];
for ( int i=0;i<size;i++)
filled1[i]=filled2[i]=0;
}
int inserare ( int a)
{
int aux;
int j=0;
if( Hash1[place1(a)]==0 && filled1[place1(a)]==0)
{
filled1[place1(a)]=1;
Hash1[place1(a)]=a;
return 1;
}
while(j < log2(size))
{
if ( Hash2[place2(a)]==0 && filled2[place2(a)]==0)
{
filled2[place2(a)]=1;
Hash2[place2(a)]=a;
return 1;
}
aux=Hash2[place2(a)];
Hash2[place2(a)]=a;
a=aux;
if ( Hash1[place1(a)]==0 && filled1[place1(a)]==0)
{
filled1[place1(a)]=1;
Hash1[place1(a)]=a;
return 1;
}
aux=Hash1[place1(a)];
Hash1[place1(a)]=a;
a=aux;
j+=2;
}
return 0;
}
int stergere( int a )
{
if(Hash1[place1(a)]==a && filled1[place1(a)]== 1)
Hash1[place1(a)]=filled1[place1(a)]=0;
if(Hash2[place2(a)]==a && filled2[place2(a)]==1)
Hash2[place2(a)]=filled2[place2(a)]=0;
return 1;
}
int gasit( int a )
{
if( Hash1[place1(a)]==a && filled1[place1(a)]==1)
return 1;
if(Hash2[place2(a)]==a && filled2[place2(a)]==1)
return 1;
return 0;
}
void make_Hash()
{
ifstream f( "hashuri.in");
ofstream g( "hashuri.out");
int n;
int ok=1;
f>>n;
int y;
int j=1;
int x;
for( int i=0;i<n && j ;i++)
{
f>>y;
f>>x;
if( y==1)
{
if( gasit(x) == 0)
ok=inserare(x);
if( ok==0) {
j=0;
break;
}
continue;
}
else if(y==2)
stergere(x);
else if(y==3)
g<< gasit(x)<<"\n";
}
f.close();
g.close();
if ( j==0)
make_Hash();
}
};
int main()
{
Hash *cuckoo;
cuckoo= new Hash(1000000);
cuckoo->make_Hash();
return 0;
}