Cod sursa(job #913026)

Utilizator vladm97Matei Vlad vladm97 Data 13 martie 2013 07:57:00
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<fstream>
#include<time.h>
#include<iostream>
#include <stdlib.h>
#define size 500000
using namespace std;
int a1,a2,*v1,*v2;
 
void aloca(){
    v1=(int*)calloc(size,sizeof(int));
    v2=(int*)calloc(size,sizeof(int));
}
 
int h1(int x){
    long long c=a1;
    c+=x;
    c*=c;
    c+=a2;
	c%=size;
    return c;
}
 
int h2(int x){
    long long c=a2;
    c-=x;
    c*=c;
    c+=a1;
	c%=size;
    return c;
}
 
void reset(){
    a1=rand()%size;
    a2=rand()%size;
}
 
int cautare(int x){
    if(v1[h1(x)]==x)return 1;
    if(v2[h2(x)]==x)return 1;
    return 0;
}

int inserare(int x){
	if(cautare(x)==1)return 1;
	int k=0,aux;
	while(k<30){
		if(v1[h1(x)]==0){
            v1[h1(x)]=x;
            return 1;}
		else if(v2[h2(x)]==0){
			v2[h2(x)]=x;
			return 1;}
		else{
			k++;
			if(k%2==1){
				aux=v1[h1(x)];
				v1[h1(x)]=x;
				x=aux;}
			else{
				aux=v2[h2(x)];
				v2[h2(x)]=x;
				x=aux;}
		}
	}
	return 0;
}
		
void sterge(int x){
    if(v1[h1(x)]==x)v1[h1(x)]=0;
    else if(v2[h2(x)]==x)v2[h2(x)]=0;
}

void rehash(int k){
	reset();
	int i,op,x;
	ifstream f("hahsuri.in");
	f>>i;
	for(i=1;i<=k;i++){
        f>>op>>x;
        if(op==1)
			if(inserare(x)==0)rehash(k);
        if(op==2){
            if(cautare(x)==1)
                sterge(x);
        }
	}
	f.close();
}
	
main(){
	srand(time(NULL));
    int n,i,op,x;
    ifstream f("hashuri.in");
    ofstream g("hashuri.out");
    f>>n;
    aloca();
    reset();
	for(i=1;i<=n;i++){
        f>>op>>x;
        if(op==1)
			{if(inserare(x)==0)rehash(i);}
        if(op==2){
            if(cautare(x)==1)
                sterge(x);
        }
        if(op==3){
                if(cautare(x)==1)
                    g<<1<<"\n";
                else g<<0<<"\n";
        }
    }       
}