Cod sursa(job #907561)

Utilizator costel93FMI - Dumea Eduard Constantin costel93 Data 8 martie 2013 01:24:50
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.6 kb
#include <fstream>
#include <string.h>
#include <vector>
#include<math.h>
#include <cstdlib>
#include <stdlib.h>
#include <time.h>

using namespace std;

ifstream f("hashuri.in");
ofstream g("hashuri.out");

int inserare(int a, int b, int hash[], int mod, int val)
{
	int nr;
	nr = (a+b*val)%mod;

	if( (hash[nr] == 0) || (hash[nr] == val) )
	{
		hash[nr] = val;
		return 0;
	}

	int aux;
	aux= hash[nr];
	hash[nr]=val;
	return aux;
}

bool  adaugare(int a, int b, int c, int d, int hash1[], int hash2[], int mod1, int mod2, int val)
{
	int poz, start=1, aux;
	
	aux = inserare(a, b, hash1, mod1, val);
	
		
		
	while(aux!=0)
	{
		if( aux == val )
			return 0;
		else
			if(start==1)
			{
				aux = inserare(c, d, hash2, mod2, val);
				start= 0;
			}
			else
			{
				aux = inserare(a, b, hash1, mod1, val);
				start= 1;
			}
	}
	return 1;
	
}		
		
	
void  stergere(int a, int b, int c, int d, int hash1[], int hash2[], int mod1, int mod2, 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;
}

		
void cautare(int a, int b, int c, int d, int hash1[], int hash2[], int mod1, int mod2, int val)
{
	int poz;
	
	if( ( hash1[(a+b*val)%mod1] == val ) || ( hash2[(c+d*val)%mod2] == val ) )
		g<<1<<"\n";
	else
		g<<0<<"\n";
}
	
		
void rezolvare()
{

	int n, op, val, i, a, b, c, d, mod1, mod2, ok=0, nr1, nr2, *hash1, *hash2;
	
	
	int pr[]={666013, 666769, 667519, 668273, 669023, 669787, 670541, 671287, 672041, 672787, 673549, 674299, 675067, 675817, 676573, 677321, 678077, 678823, 679597, 680347};
	
	srand( time( NULL ) );
	
	f>>n;
	
	for(i=1; i <= n; i++)
	{
		f>>op>>val;
		
		if(op==1)
		{
			while(ok==0)
			{
				free(hash1);
				free(hash2);
				a = rand()%10000+100;
				b = rand()%10000+100;
				c = rand()%10000+100;
				d = rand()%10000+100;
				nr1 = rand()%20+1;
				nr2 = rand()%20+1;
				mod1 = 666013;                    //pr[nr1];
				mod1 = 666013;                       //pr[nr2];
				hash1 = (int *)malloc(1000000 * sizeof(int));
				hash2 = (int *)malloc(1000000 * sizeof(int));
				memset(hash1,0,1000000);
				memset(hash1,0,1000000);
				
			
				ok = adaugare(a, b, c, d, hash1, hash2, mod1, mod2, val);
			}
			
			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
				cautare(a, b, c, d, hash1, hash2, mod1, mod2, val);
	}
	
	free(hash1);
	free(hash2);
}

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