Cod sursa(job #906006)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 6 martie 2013 13:25:11
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 4.14 kb
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <cstring>
#include <string>
#include <fstream>
#include <cassert>
 
using namespace std;
 
#define DIM2 8192

const int prime = 2000000011;
const int sz = 1000400;
//const int MAXSTEP = 7; 
 
#define F1 (f_h1(a1, b1, prime, x, sz))
#define F2 (f_h1(a2, b2, prime, x, sz))

inline void cit(int &x, char *&vec, int &poz)   
{   
  x=0;   
  while(vec[poz]<'0' || vec[poz]>'9')   
       if(++poz==DIM2) fread(vec,1,DIM2,stdin),poz=0;   
   
    while(vec[poz]>='0' && vec[poz]<='9')   
    {   
        x=x*10+vec[poz]-'0';   
        if(++poz==DIM2) fread(vec, 1, DIM2, stdin),poz=0;   
    }  
}   
 
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 f_h2(int a, int b, int prime, int val, int sz) {
	return ( (long long) a * val / prime ) % sz;
}
inline int f_h1(int a, int b, int prime, int val, int sz) {
    return (( (1LL * a * val + (long long) b) % ((long long)prime) ) % (long long)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];
     
    for(int i = 0; i < n; ++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);

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

    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;
    int MAXSTEP = 30;
    while(steps < MAXSTEP) {
        int y;
        steps += 2;
                 
        if( h1[F1] == 0) {
            h1[F1] = x ; 
            return true;
 
        }       
        y = h1[F1] ; h1[F1] = x; x = y;
        if(h2[F2] == 0) {
            h2[F2] = x;
            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 (  (h1[F1] == x) || (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) {
        h1[F1] = 0;
        return ;
    }
    if(h2[F2] == x) {
        h2[F2] = 0;
        return ;
    }
}
bool deleteTable(int *&h1, int *&h2, char *&v1, char *&v2) {
    delete[] h1 ;
    delete[] h2 ;
    return false;
}
int main() {
     

	
    freopen("hashuri.in", "r", stdin);    	
    ofstream fout("hashuri.out");
	

    srand(time(NULL));    
    int a1, b1, a2, b2;
    int *h1, *h2;
    char *v1, *v2;
    
    char *omg = new char[8192];

    int poz = 0;
    int Q, op, x;
 
    createFunctions(a1, a2, b1, b2);
    createTable(h1, h2, v1, v2, sz);
	
    for( cit(Q, omg, poz); Q--; ) {
        
	cit(op, omg, poz);
       	cit(x, omg, poz);
        if(op == 1) {
            while( insert(h1, h2, v1, v2, a1, b1, a2, b2, x) == false) {
                createFunctions(a1, a2, b1, b2);
            }
        }
        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;
}