Cod sursa(job #919842)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 19 martie 2013 20:56:38
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.89 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 start=0, nr=0, poz1, poz2;
	unsigned int aux, aux2;
	
	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=hash2[poz2];
			hash2[poz2]=val;
		}
	
	while(nr<30)
	{
		poz1=(a+b*aux)%mod1;
		
		if(hash1[poz1]==0)
		{
			hash1[poz1]=aux;
			return 1;
		}
		else
		{
			aux2=aux;
			aux=hash1[poz1];
			hash1[poz1]=aux2;
			
			poz2=(a+b*aux)%mod2;
			
			if(hash2[poz2]==0)
			{
				hash2[poz2]=aux;
				return 1;
			}
			else
			{
				aux2=aux;
				aux=hash2[poz2];
				hash2[poz2]=aux2;
			}
		}

	}
	
	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)
{
	if( ( hash1[(a+b*val)%mod1] == val ) )
		hash1[(a+b*val)%mod1]=0;
		
	else
		if( hash2[(c+d*val)%mod2] == val )
			hash2[(c+d*val)%mod2] = 0;
}

		
bool cautare(int a, int b, int c, int d, unsigned int *hash1, unsigned int *hash2, int mod1, int mod2, unsigned int val)
{
	
	if( ( hash1[(a+b*val)%mod1] == val ) || ( hash2[(c+d*val)%mod2] == 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+1;
		b = rand()%1000000+1;
		
		c = rand()%1000000+1;
		d = rand()%1000000+1;
		
		//cout<<a<<" "<<b<<"\n";
		
		
		nr1 = rand()%5;
		nr2 = rand()%5;
		
		mod1 = pr[nr1]; 
		mod2 = pr[nr2];
		mod2 = mod1;
		
	
		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);
			
				//cout<<i<<" "<<op<<" "<<val<<"\n";
		
			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));
		}
		
	}
	
	free(hash1);
	free(hash2);
}

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