Cod sursa(job #915184)

Utilizator ioanapopaPopa Ioana ioanapopa Data 14 martie 2013 19:57:49
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include<fstream>
#include<cmath>
#include<algorithm>
#define PRIM 1000000009
using namespace std;
double log2( double n)
{
	return log(n)/log(2);
}
class Hash
{
	int *filled1,*filled2;
	long long q1,q2;
	int size;
	int *Hash1, *Hash2;
	int place1(int a)
	{
		return ( (q1*(long long )a+(long long)q2)%PRIM%(long long )size);
	}
	int place2(int a)
	{
		return((q2*(long long)a+(long long)q1)%PRIM%(long long )size);
	}
	void function()
	{
		q1=rand()%size;
		q2=rand()%size;
	}
public:
	Hash(){}

		Hash ( int b)
	{
		function();
		size=b;
		Hash1= new int[size];
		Hash2= new int[size];
		for (int i=0;i<size;i++)
			Hash1[i]=Hash2[i]=0;

		filled1=new int [size];
		filled2=new int [size];
		for ( int i=0;i<size;i++)
			filled1[i]=filled2[i]=0;
		
	}

	int inserare ( int a)
	{
		

		int aux;
		
		int j=0;


			if( Hash1[place1(a)]==0 && filled1[place1(a)]==0)
			{
				filled1[place1(a)]=1;
				Hash1[place1(a)]=a;
				
				return 1;
			}
			while(j < log2(size))
			{
				if ( Hash2[place2(a)]==0 && filled2[place2(a)]==0)
				{
				filled2[place2(a)]=1;
				Hash2[place2(a)]=a;			
				return 1;
				}
				
					aux=Hash2[place2(a)];
					Hash2[place2(a)]=a;
					a=aux;
					

				if ( Hash1[place1(a)]==0 && filled1[place1(a)]==0)
				{
				filled1[place1(a)]=1;
				Hash1[place1(a)]=a;			
				return 1;
				}
					aux=Hash1[place1(a)];
					Hash1[place1(a)]=a;
					a=aux;

				j+=2;
		}
	return 0;
	}

	int stergere( int a )
	{
		if(Hash1[place1(a)]==a && filled1[place1(a)]== 1)
			Hash1[place1(a)]=filled1[place1(a)]=0;
		if(Hash2[place2(a)]==a && filled2[place2(a)]==1)
			Hash2[place2(a)]=filled2[place2(a)]=0;
		return 1;

	}
	int gasit( int a )
	{
		if( Hash1[place1(a)]==a && filled1[place1(a)]==1)
			return 1;
		if(Hash2[place2(a)]==a && filled2[place2(a)]==1)
			return 1;
		return 0;
	}

	void make_Hash()
	{
		ifstream f( "hashuri.in");
		ofstream g( "hashuri.out");
		int n;
		int ok=1;
		f>>n;
		int y;
		int j=1;
		int x;
		for( int i=0;i<n && j ;i++)
		{	
			f>>y;
			f>>x;
			if( y==1)
			{
				if( gasit(x) == 0)
				ok=inserare(x);
				if( ok==0) {
								j=0;
								break;
							}
				continue;

			}

				else if(y==2) 
					stergere(x);
					else if(y==3) 
						g<< gasit(x)<<"\n";
			
		}
		f.close();
		g.close();
		if ( j==0) 
			make_Hash();
	}
};
int main()
{
	Hash *cuckoo;
	cuckoo= new Hash(1000000);
	cuckoo->make_Hash();
	return 0;
}