Pagini recente » Cod sursa (job #1096373) | Cod sursa (job #333) | Cod sursa (job #2405661) | Cod sursa (job #3275771) | Cod sursa (job #938551)
Cod sursa(job #938551)
#include <fstream>
#include <string.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
class prototip
{
public:
int *hash1;
int *hash2;
int fact1;
int fact2;
int size;
int prim;
char *filein,*fileout;
void aloca();
int inserare(int x);
void golire();
void randomiz();
int funct1(int x);
int funct2(int x);
void stergere(int x);
int cautare(int x);
void rehash(int j);
void operatii();
};
class hash: public prototip
{
public:
void operatii()
{
srand(time(NULL));
randomiz();
golire();
ifstream f(filein);
ofstream g(fileout);
int n,x,op;
f>>n;
for(int i=1;i<=n;i++)
{
f>>op>>x;
if((op==1)&&(inserare(x)==0))rehash(i);
if(op==2) if(cautare(x)==1)stergere(x);
if(op==3)
{
if(cautare(x)==1)
g<<1<<"\n";
else g<<0<<"\n";
}
}
}
void aloca()
{
size=1000000;
hash1=(int*)calloc(size,sizeof(int));
hash2=(int*)calloc(size,sizeof(int));
}
void golire()
{
for(int i=1;i<size;i++)
{
hash1[i]=0;
hash2[i]=0;
}
}
int funct1(int x)
{
int c;
c=(((long long) x*(long long)(fact1%10)+(long long)x%fact2)+(long long)x*5)%size;
return c;
}
int funct2(int x)
{
int c;
c=(((long long)x*((long long)(fact1%10))%prim)+(long long)x*(long long)(fact1%10))%size;
return c;
}
void randomiz()
{
fact1=rand()%prim;
fact2=rand()%prim;
}
int cautare(int x)
{
if(hash1[funct1(x)]==x)return 1;
if(hash2[funct2(x)]==x)return 1;
return 0;
}
int inserare(int x)
{
if(cautare(x)==1)return 1;
int k=0,aux;
while(k<30)
{
if(hash1[funct1(x)]==0)
{
hash1[funct1(x)]=x;
return 1;
}
else
if(hash2[funct2(x)]==0)
{
hash2[funct2(x)]=x;
return 1;
}
else
{
k++;
if(k%2==1)
{
aux=hash1[funct1(x)];
hash1[funct1(x)]=x;
x=aux;
}
else
{
aux=hash2[funct2(x)];
hash2[funct2(x)]=x;
x=aux;
}
}
}
return 0;
}
void stergere(int x)
{
if(hash1[funct1(x)]==x)hash1[funct1(x)]=0;
if(hash2[funct2(x)]==x)hash2[funct2(x)]=0;
}
void rehash(int j)
{
golire();
randomiz();
int op,x;
ifstream f(filein);
f>>op;
for(int i=1;i<=j;i++)
{
f>>op>>x;
if((op==1)&&(inserare(x)==0))rehash(j);
if((op==2)&&(cautare(x)==1))stergere(x);
}
}
hash(char *in,char *out)
{
aloca();
prim=20547;
filein=new char[strlen(in)];
fileout=new char[strlen(out)];
strcpy(filein,in);
strcpy(fileout,out);
}
~hash()
{
delete[] hash1;
delete[] hash2;
delete[] filein;
delete[] fileout;
}
};
main()
{
hash coocko("hashuri.in","hashuri.out");
coocko.operatii();
return 0;
}