Cod sursa(job #913066)

Utilizator vladm97Matei Vlad vladm97 Data 13 martie 2013 08:48:27
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include<fstream>
#include<time.h>
#include<iostream>
#include <stdlib.h>
#define size 500000
#define prim 18593
using namespace std;
int a1,a2,*v1,*v2;
 
void aloca(){
    v1=(int*)calloc(size,sizeof(int));
    v2=(int*)calloc(size,sizeof(int));
}
 void null(){
	 int i;
	 for(i=0;i<size;i++)
		 v1[i]=v2[i]=0;
 }
int h1(int x){
    long long c;
	c=((x+a1)%prim+(x+a2)%prim+(x+2*a1)%prim+(x+2*a2))%size;
    return c;
}
 
int h2(int x){
    long long c;
   c=((x+3*a1)%prim+(x+2*a2)%prim+(x*3)%prim+(x*(a2%10))%prim)%size;
   return c;
}
 
void reset(){
    a1=rand()%prim;
    a2=rand()%prim;
}
 
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();
	null();
	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";
        }
    }       
}