Pagini recente » Cod sursa (job #2752607) | Cod sursa (job #2950902) | Cod sursa (job #2349185) | Cod sursa (job #1868108) | Cod sursa (job #920115)
Cod sursa(job #920115)
#include<iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
using namespace std;
class Hash
{
int mod1, mod2, a, b, c, d, size;
unsigned int *hash1, *hash2;
public:
void SetHash();
bool adaugare(unsigned int);
void stergere(unsigned int);
bool cautare(unsigned int);
void rezolvare();
Hash(unsigned int);
};
Hash::Hash(unsigned int x)
{
size=x;
hash1 = (unsigned int *) malloc (size * sizeof (unsigned int) );
hash2 = (unsigned int *) malloc (size * sizeof (unsigned int) );
}
void Hash::SetHash()
{
int pr[]={999983,999979,899981,900007,800011};
a = rand () % 10000000 + 10;
b = rand () % 10000000 + 10;
c = rand () % 10000000 + 10;
d = rand () % 10000000 + 10;
mod1 = pr[rand () % 5];
mod2 = pr[rand () % 5];
}
bool Hash::adaugare(unsigned int val)
{
int nr=0, poz1, poz2;
unsigned int aux;
poz1=(a+b*val)%mod1;
poz2=(c+d*val)%mod2;
if(hash1[poz1]==val || hash2[poz2]==val)
return 1;
if(hash1[poz1]==0)
{
hash1[poz1]=val;
return 1;
}
else
if(hash2[poz2]==0)
{
hash2[poz2]=val;
return 1;
}
else
{
aux = val;
val = hash1[poz1];
hash1[poz1] = aux;
}
while(nr<30)
{
nr++;
poz2=(c+d*val)%mod2;
if(hash2[poz2]==0)
{
hash2[poz2]=val;
return 1;
}
else
{
poz1=(a+b*hash2[poz2])%mod1;
aux=hash2[poz2];
hash2[poz2]=val;
val=hash1[poz1];
hash1[poz1]=aux;
}
}
return 0;
}
void Hash::stergere(unsigned int val)
{
int poz1, poz2;
poz1=(a+b*val)%mod1;
poz2=(c+d*val)%mod2;
if( ( hash1[poz1] == val ) )
hash1[poz1]=0;
else
if( hash2[poz2] == val )
hash2[poz2] = 0;
}
bool Hash::cautare(unsigned int val)
{
int poz1, poz2;
poz1=(a+b*val)%mod1;
poz2=(c+d*val)%mod2;
if( ( hash1[poz1] == val ) || ( hash2[poz2] == val ) )
return 1;
else
return 0;
}
void Hash::rezolvare()
{
unsigned int *hash1, *hash2, val;
int n, op, i, a, b, c, d, mod1, mod2, ok=0, nr1, nr2;
srand( time( NULL ) );
while(ok==0)
{
SetHash();
memset(hash1,0,size);
memset(hash2,0,size);
FILE *f = fopen ("hashuri.in", "r");
FILE *g = fopen ( "hashuri.out", "w");
fscanf (f,"%d", &n);
ok=1;
for(i=1; i <= n && ok; i++)
{
fscanf (f, "%d %d", &op, &val);
if(op==1)
ok = adaugare(val);
else
if(op==2)
stergere(val);
else
fprintf( g,"%d\n", cautare(val));
}
}
}
int main()
{
Hash h(1000000);
h.rezolvare();
return 0;
}