Cod sursa(job #718617)

Utilizator dany123Florea Daniel dany123 Data 20 martie 2012 22:12:37
Problema Hashuri Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
//hashing with open adressing
//fara var globale
//h(x) = (h'(x) + r1 * i + r2 * i^2) % M
//Florea Daniel-Ciprian, gr. 135.
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<cstring>
using namespace std;

inline int has (int x, int i, int nmax, int r1, int r2) //(dadea erori daca scriam hash)
{
	int rez=abs((x%nmax+r1*i+r2*i*i))%nmax;
	//assert (rez<=nmax && rez>=0);
	return rez;
}
void inserare (int v[], int x, int n, int nmax, int r1, int r2)
{
	int k=0;
	while (v[has(x,k,nmax,r1,r2)]!=0 && v[has(x,k,nmax,r1,r2)]!=-1 && k<=nmax)
		k++;
	if (k>=n+1) 
	{
		cout<<"Vectorul este plin!"; 
		return;
	}
	v[has(x,k,nmax,r1,r2)]=x;
}

void stergere (int v[], int x, int n, int nmax, int r1, int r2)
{
	int k=0;
	while (v[has(x,k,nmax,r1,r2)]!=x && v[has(x,k,nmax,r1,r2)]!=0 && k<=nmax) k++;
	if (has(x,k,nmax,r1,r2)==0) return;
	else if (k<=n) v[has(x,k,nmax,r1,r2)]=-1;
}

bool cautare (int v[], int x, int n, int nmax, int r1, int r2)
{
	int k=0;
	while (v[has(x,k,nmax,r1,r2)]!=x && v[has(x,k,nmax,r1,r2)]!=0 && k<=nmax) k++;
		if (k<=n && v[has(x,k,nmax,r1,r2)]==x) return 1;
		else return 0;
}


int main ()
{
	ifstream fin ("hashuri.in");
	ofstream fout ("hashuri.out");
	int op,x,n;
	fin>>n;
	int nmax=n;
	int *v = new int [n]; //nu pot declara static un vector mare
	memset (v,0,sizeof(v)*n);
	
	//initializam 2 valori random pt functia de hash
	int r1,r2;
	srand(time(NULL));
	r1=rand()%nmax;
	r2=rand()%nmax;
	
	for (int i=1;i<=n;i++)
	{
		fin>>op>>x;
		if (op==1) {
			if (!cautare(v,x,n,nmax,r1,r2)) 
				inserare(v,x,n,nmax,r1,r2);
		}
		else if (op==2) stergere(v,x,n,nmax,r1,r2);
		else if (op==3) fout<<cautare(v,x,n,nmax,r1,r2)<<'\n';
	}
	fin.close();
	fout.close();
	delete[] v;
	return 0;
}