Cod sursa(job #920114)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 20 martie 2013 02:37:57
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.73 kb
#include<iostream>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

using namespace std;

unsigned int* alocare (unsigned int *hash, int mod)
{
    hash = (unsigned int *) malloc (mod * sizeof (unsigned int) );
    return hash;
}

int  adaugare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, 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  stergere(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, 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 cautare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, 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 rezolvare()
{

    unsigned int *hash1, *hash2, val;
	
	int n, op, i, a, b, c, d, mod1, mod2, ok=0, nr1, nr2, size=1000000;
	
	int pr[]={999983, 999979, 899981, 900007,800011, 678077, 678823, 679597, 680347};
	
	srand( time( NULL ) );
	
	hash1 = alocare(hash1, size);
	hash2 = alocare(hash2, size);
	
	while(ok==0)
	{
		a = rand()%1000000+10;
		b = rand()%1000000+10;
		
		c = rand()%1000000+10;
		d = rand()%1000000+10;
		
		nr1 = rand()%9;
		nr2 = rand()%9;
		
		mod1 = pr[nr1]; 
		mod2 = pr[nr2];
		
		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(a, b, c, d, hash1, hash2, mod1, mod2, val);
			else
				if(op==2)
					stergere(a, b, c, d, hash1, hash2, mod1, mod2, val);
				else
					fprintf( g,"%d\n", cautare(a, b, c, d, hash1, hash2, mod1, mod2, val));
		}
		
	}
}

int main()
{
	
    rezolvare();
	
    return 0;
}