Pagini recente » Cod sursa (job #2236625) | Cod sursa (job #1886541) | Cod sursa (job #422531) | Cod sursa (job #1525693) | Cod sursa (job #902448)
Cod sursa(job #902448)
#include<stdio.h>
#define M 2077777
#define H1 177777
#define H2 111333
inline int h1(int a)
{
return (1LL*H1*a+H2)%M;
}
inline int h2(int a)
{
return (1LL*H2*a+H1)%M;
}
inline void initializare(int *p)
{
int i;
for(i=0;i<M;i++)
*(p+i) = 0;
}
inline int exist(int *p,int x)
{
if(*(p+h1(x)) == x || *(p+h2(x)) == x)
return 1;
return 0;
}
inline void rehash(int *p,int x)
{
int hash2 = h2(x),y;
if(*(p+hash2) != 0)
{
y = *(p+hash2);
*(p+hash2) = x;
rehash(p,y);
}
}
inline void add(int *p,int x)
{
if(exist(p,x))
return ;
int hash1 = h1(x),y;
if(*(p+hash1) != 0)
{
y = *(p+hash1);
*(p+hash1) = x;
// printf("rehash\n");
rehash(p,y);
}
else
*(p+hash1) = x;
}
inline void sterge(int *p,int x)
{
int hash1 = h1(x),hash2 = h2(x);
if(*(p+hash1) == x)
*(p+hash1) = 0;
else if(*(p+hash2) == x)
*(p+hash1) = 0;
}
void main()
{
FILE *f = fopen("hashuri.in","r");
FILE *g = fopen("hashuri.out","w");
int *p;
int N,op,a;
p = (int*)malloc(M*sizeof(int));
initializare(p);
int i;
fscanf(f,"%d",&N);
for(i=1;i<=N;i++)
{
fscanf(f,"%d %d",&op,&a);
switch(op)
{
case 1 : add(p,a);
break;
case 2 : sterge(p,a);
break;
case 3 : fprintf(g,"%d\n",exist(p,a));
}
}
fclose(f);
fclose(g);
// for(i=0;i<M;i++)
// printf("%d\n",*(p+i));
}