Cod sursa(job #912305)

Utilizator vladm97Matei Vlad vladm97 Data 12 martie 2013 11:51:14
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include<fstream>
#include<time.h>
#include <stdlib.h>
using namespace std;
int a1,a2,*v1,*v2;

void aloca(int n){
	v1=(int*)calloc(n+1,sizeof(int));
	v2=(int*)calloc(n+1,sizeof(int));
}

int h1(int x,int n){
	long long c=a1;
	c+=x;
	c*=c;
	c+=a2;
	c%=n;
	return c;
}

int h2(int x,int n){
	long long c=a2;
	c-=x;
	c*=c;
	c+=a1;
	c%=n;
	return c;
}

void reset(int n){
	a1=rand()%n;
	a2=rand()%n;
}

void inserare(int x, int n);

void rehash(int n){
	reset(n);
	int *v3=v1;
	int *v4=v2;
	int i;
	aloca(n);
	for(i=1;i<=n;i++){
		if(i[v3]!=0)inserare(i[v3],n);
		if(i[v4]!=0)inserare(i[v3],n);
	}
	free(v3);
	free(v4);
}

int cautare(int x,int n){
	if(v1[h1(x,n)]==x)return 1;
	if(v2[h2(x,n)]==x)return 1;
	return 0;
}

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

void sterge(int x,int n){
	if(v1[h1(x,n)]==x)v1[h1(x,n)]=0;
	else if(v2[h2(x,n)]==x)v2[h2(x,n)]=0;
}

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