Cod sursa(job #920115)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 20 martie 2013 03:03:34
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.63 kb
#include<iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

using namespace std;

class Hash
{
    int mod1, mod2, a, b, c, d, size;
    unsigned int *hash1, *hash2;
 
public:
    void SetHash();
    bool adaugare(unsigned int);
    void stergere(unsigned int);
    bool cautare(unsigned int);
    void rezolvare();
    Hash(unsigned int);
 
};



Hash::Hash(unsigned int x)
{
	size=x;
    hash1 = (unsigned int *) malloc (size * sizeof (unsigned int) );
	hash2 = (unsigned int *) malloc (size * sizeof (unsigned int) );
}


void Hash::SetHash()
{
    int pr[]={999983,999979,899981,900007,800011};
    a = rand () % 10000000 + 10;
    b = rand () % 10000000 + 10;
    c = rand () % 10000000 + 10;
	d = rand () % 10000000 + 10;
    mod1 = pr[rand () % 5];
	mod2 = pr[rand () % 5];
}

bool Hash::adaugare(unsigned int val)
{
	int nr=0, poz1, poz2;
	unsigned int aux;
	
	poz1=(a+b*val)%mod1;
	poz2=(c+d*val)%mod2;
	
	if(hash1[poz1]==val || hash2[poz2]==val)
		return 1;
	
	if(hash1[poz1]==0)
	{
		hash1[poz1]=val;
		return 1;
	}
	else
		if(hash2[poz2]==0)
		{
			hash2[poz2]=val;
			return 1;
		}
		else
		{
			aux = val;
			val = hash1[poz1];
			hash1[poz1] = aux;
		}
	
	while(nr<30)
	{
		nr++;
		
		poz2=(c+d*val)%mod2;
		
		if(hash2[poz2]==0)
		{
			hash2[poz2]=val;
			return 1;
		}
		else
		{
			poz1=(a+b*hash2[poz2])%mod1;
			aux=hash2[poz2];
			hash2[poz2]=val;
			val=hash1[poz1];
			hash1[poz1]=aux;
		}
	}
	
	return 0;
}		
		
	
void  Hash::stergere(unsigned int val)
{
	int poz1, poz2;
	
	poz1=(a+b*val)%mod1;
	poz2=(c+d*val)%mod2;
	
	if( ( hash1[poz1] == val ) )
		hash1[poz1]=0;
		
	else
		if( hash2[poz2] == val )
			hash2[poz2] = 0;
}

		
bool Hash::cautare(unsigned int val)
{
	int poz1, poz2;
	
	poz1=(a+b*val)%mod1;
	poz2=(c+d*val)%mod2;
	
	if( ( hash1[poz1] == val ) || ( hash2[poz2] == val ) )
		return 1;
	else
		return 0;
}
	
		
void Hash::rezolvare()
{
    unsigned int *hash1, *hash2, val;
	
	int n, op, i, a, b, c, d, mod1, mod2, ok=0, nr1, nr2;
	
	srand( time( NULL ) );
	
	while(ok==0)
	{
		SetHash();
		
		memset(hash1,0,size);
		memset(hash2,0,size);
	
		FILE *f = fopen ("hashuri.in", "r");
		FILE *g = fopen ( "hashuri.out", "w");
	
		fscanf (f,"%d", &n);
		
		ok=1;
	
		for(i=1; i <= n && ok; i++)
		{
			fscanf (f, "%d %d", &op, &val);
		
			if(op==1)
				ok = adaugare(val);
			else
				if(op==2)
					stergere(val);
				else
					fprintf( g,"%d\n", cautare(val));
		}
		
	}
}

int main()
{
	Hash h(1000000);
	
    h.rezolvare();
	
    return 0;
}