Pagini recente » Cod sursa (job #1932143) | Cod sursa (job #169771) | Cod sursa (job #1062) | Cod sursa (job #747693) | Cod sursa (job #708341)
Cod sursa(job #708341)
#include <fstream>
#include <cstdlib>
#include <ctime>
using namespace std;
#define DEL -1
#define NIL 0
class hash_table {
int hash_size;
int *T;
int max_octet,size_octet;
int *a1,*a2;
int h1 (int key) {
int i,ret;
ret=0;
for (i=0; i<max_octet; ++i) {
ret=(ret+(key&((1<<this->size_octet)-1))*this->a1[i])%this->hash_size;
key>>=this->size_octet;
if (!key)
break ;
}
return ret;
}
int h2 (int key) {
int i,ret;
ret=0;
for (i=0; i<this->max_octet; ++i) {
ret=(ret+(key&((1<<this->size_octet)-1))*this->a2[i])%this->hash_size;
key>>=this->size_octet;
if (!key)
break ;
}
return ret;
}
int h (int key,int poz) {
return (this->h1 (key)+poz*this->h2 (key))%this->hash_size;
}
public:
hash_table (int hash_size,int max_octet,int size_octet) {
int i;
this->hash_size=hash_size;
this->T=new int[hash_size];
this->max_octet=max_octet;
this->size_octet=size_octet;
this->a1=new int[max_octet];
this->a2=new int[max_octet];
for (i=0; i<max_octet; ++i) {
this->a1[i]=rand ()%hash_size;
this->a2[i]=rand ()%hash_size;
}
}
int find (int key) {
int i,j;
for (i=0; i<this->hash_size; ++i) {
j=this->h (key,i);
if (this->T[j]==key)
return j;
if (this->T[j]==NIL)
return 0;
}
return 0;
}
void insert (int key) {
int i,j,is;
is=this->find (key);
if (is)
return ;
for (i=0; i<this->hash_size; ++i) {
j=this->h (key,i);
if (this->T[j]==NIL || this->T[j]==DEL) {
this->T[j]=key;
return ;
}
}
}
void erase (int key) {
int is;
is=this->find (key);
if (!is)
return ;
this->T[is]=DEL;
}
};
int main () {
srand (time (NULL));
ifstream fin ("hashuri.in");
ofstream fout ("hashuri.out");
hash_table Hash (1000003,8,4);
int T,i,x,tip;
fin>>T;
for (i=1; i<=T; ++i) {
fin>>tip>>x;
if (tip==1)
Hash.insert (x);
if (tip==2)
Hash.erase (x);
if (tip==3) {
if (Hash.find (x))
fout<<"1\n";
else
fout<<"0\n";
}
}
return 0;
}