Cod sursa(job #905848)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 6 martie 2013 11:24:18
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 3.3 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>
#include <cassert>

using namespace std;

const int MAXSTEP = 30;
const int prime = 402653189;
const int sz = 700000;


#define F1 (h(a1, b1, prime, x, sz))
#define F2 (h(a2, b2, prime, x, sz))

inline bool insert(int *&h1, int *&h2, char *&v1, char *&v2 , 
			int &a1, int &b1, int &a2, int &b2, int x) ;

bool deleteTable(int *&h1, int*&h2, char *&v1, char *&v2);


inline int h(int a, int b, int prime, int val, int sz) {
	return (( (1LL * a * val + b) % (long long)prime ) % sz);
}

inline void createFunctions(int &a1, int &a2, int &b1, int &b2) {		
	a1 = rand() % sz; 
	a2 = rand() % sz;
	b1 = rand() % sz;
       	b2 = rand() % sz;

}
inline void createTable(int *&h1, int *&h2, char *&v1, char *&v2, int n) {
	
	h1 = new int[n];
	h2 = new int[n];
	v1 = new char[n];
	v2 = new char[n];
	
	for(int i = 0; i < n; ++i)
		v1[i] = v2[i] = h1[i] = h2[i] = 0;
	
}
inline bool rehash( int *&h1, int *&h2, char *&v1, char *&v2,
	       int &a1, int &a2, int &b1, int &b2) {

	createFunctions(a1, a2, b1, b2);
//	cout << a1 <<  " " << a2 << " " << b1 << " " << b2 << "\n";
	int* hh1; int* hh2 ;
       	char* vv1; char* vv2 ; 
	
	createTable(hh1, hh2, vv1, vv2, sz);

	for(int i = 0; i < sz; ++i) {
		if(v1[i]) 
			if( insert(hh1, hh2, vv1, vv2 , a1, b1, a2 , b2, h1[i] ) == false)
				return deleteTable(hh1, hh2, vv1, vv2);
		if(v2[i])
			if( insert(hh1 , hh2 , vv1, vv2 , a1 , b1 , a2, b2, h2[i]) == false)
				 return deleteTable(hh1, hh2, vv1, vv2);
	}

	h1 = hh1;
       	h2 = hh2;
       	v1 = vv1;
       	v2 = vv2;
	
	return true;
}	
inline bool insert( int *&h1, int *&h2, char *&v1, char *&v2, 
		int &a1, int &b1, int &a2, int &b2, int x) {
	
	int steps = 0;
	while(steps < MAXSTEP) {
		int y;
		steps += 2;
				
		if( v1[F1] == 0) {
			h1[F1] = x ; 
			v1[F1] = 1;
			return true;

		}		
		y = h1[F1] ; h1[F1] = x; x = y;
		if(v2[F2] == 0) {
			h2[F2] = x;
			v2[F2] = 1;
			return true;
		}

		y = h2[F2] ; h2[F2] = x; x = y;

	}
	return false;
}

inline bool find( int *&h1, int *&h2, char *&v1, char *&v2,
		int a1, int b1, int a2, int b2, int x) {

	return (  (v1[F1] == 1 && h1[F1] == x) || (v2[F2] == 1 && h2[F2] == x) ) ;
}
inline void sterge( int *&h1, int *&h2, char *&v1, char *&v2,
		int a1, int b1, int a2, int b2, int x) {
	if( h1[F1] == x && v1[F1] == 1) {
		v1[F1] = 0;
		return ;
	}
	if(h2[F2] == x && v2[F2] == 1) {
		v2[F2] = 0;
		return ;
	}
}
bool deleteTable(int *&h1, int *&h2, char *&v1, char *&v2) {
	delete[] h1 ;
	delete[] h2 ;
       	delete[] v1 ;
       	delete[] v2 ;

	return false;
}
int main() {
	
	ifstream fin("hashuri.in");
	ofstream fout("hashuri.out");
		
	srand(time(NULL));

	int a1, b1, a2, b2;
	int *h1, *h2;
	char *v1, *v2;

	int Q, op, x;

	createFunctions(a1, a2, b1, b2);
	createTable(h1, h2, v1, v2, sz);
//	cout << a1 << " " << a2 << " " << b1 << " " << b2 << "\n";
	for( fin >> Q; Q--; ) {
		fin >> op >> x;

		if(op == 1) {
			while( insert(h1, h2, v1, v2, a1, b1, a2, b2, x) == false) {
				for( ; rehash(h1, h2, v1, v2, a1, b1, a2, b2) == false; );
			}
		}
		if(op == 2) {
			sterge(h1, h2, v1, v2,
					a1, b1, a2, b2, x);
			}
		if(op == 3) {
			fout << int(find(h1, h2, v1, v2, a1, b1, a2, b2, x)) << "\n";
		}
		
	}

	deleteTable(h1, h2, v1, v2);
	return 0;
}