Cod sursa(job #907677)

Utilizator cristi_berceanuFMI - Cristi Berceanu cristi_berceanu Data 8 martie 2013 10:48:32
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <time.h>
#define REP 50
#define CONST1 773010
#define CONST2 398001
#define T1 110035
#define T2 310453
#define NMAX 1100000
using namespace std;

int d1,d2;

inline int hash1(int x){
	
	return x%d1;
}

inline int hash2(int x){
	
	return x%d2;
}

inline int genereaza(){
	
	d1=CONST1+rand()%T1;
	d2=CONST2+rand()%T2;
}

bool adauga(int nr, int *v1, int *v2){

	int i,aux;
	for(i=1;i<=REP;i++){
		
		if(v1[hash1(nr)]==0)
		{
			v1[hash1(nr)]=nr;
			return 1;
		}
			if(v2[hash2(nr)]==0)
			{
				v2[hash2(nr)]=nr;
				return 1;
			}
				else
				{
					aux=v2[hash2(nr)];
					v2[hash2(nr)]=nr;
					nr=aux;
				}
	}
}

bool sterge(int nr, int *v1, int *v2){

	int x1=hash1(nr), x2=hash2(nr);
	if(v1[x1] == nr)
	{
		v1[x1] = 0;
		return 1;
	}
	if(v2[h2] == nr)
	{
		v2[x2] = 0;
		return 1;
	}
	
	
return 0;	
}
bool exista(int nr, int *v1, int *v2){

	if(v1[hash1(nr)] == nr || v2[hash2(nr)] == nr)
		return 1;
	return 0;
}

void rehash(int k, bool *op, int *nr, int *v1, int *v2){
	delete v1;
	delete v2;
	genereaza();
	v1=new int[d1+4];
	v2=new int[d2+4];
	int i;
	for(i=1; i<=k;i++){
		if(op[i])
		{
			if(!adauga(nr[i],v1,v2))
				rehash(k,op,nr,v1,v2);
			else
				sterge(nr[i],v1,v2);
		}	
	}
}
int main(){
	int n,op,x;
	freopen("hashuri.in","r",stdin);
	freopen("hashuri.out","w",stdout);
	scanf("%d",&n);
	int *v1=new int[d1+4];
	int *v2=new int[d2+4];
	bool op[n];
	int k=0,nr[n];
	while(n--){
		scanf("%d%d",&op,&x);
		if(op==1)
		{
			op[++k]=1;
			nr[k]=x;
			if(!adauga(x,v1,v2))
				rehash(k,op,nr,v1,v2);
		}
		if(op==2)
		{
			op[++k]=1;
			nr[k]=x;
			sterge(x,v1,v2);
		}
		if(op==3)
			if(exista(x,v1,v2))
				printf("1\n");
			else
				printf("0\n");
	}

	return 0;
}