Cod sursa(job #907768)

Utilizator vladm97Matei Vlad vladm97 Data 8 martie 2013 12:03:23
Problema Hashuri Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
int a1,a2;
void aloca(int *&v1,int *&v2,int n){
    v1=(int*)calloc(n+1,sizeof(int));
    v2=(int*)calloc(n+1,sizeof(int));
}

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

void inserare(int *v1,int *v2,int x,int n);

void rehash(int *v1,int *v2,int n){
	int i;
    reset(n);
    for(i=0;i<=n;i++){
        if(v1[i]!=0)inserare(v1,v2,v1[i],n);
        if(v2[i]!=0)inserare(v1,v2,v2[i],n);
    }
}
int h1(int x,int n){
long long c=a1;
c+=x;
c*=c;
c%=n;
return c;}

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

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

void inserare(int *v1,int *v2,int x,int n){
if(cautare(v1,v2,x,n)==0){
int ok=0,s=v1[h1(x,n)],aux,aux2,aux3;
    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;}
    while(ok==0){
            aux=v1[h1(x,n)];
            aux2=v2[h2(x,n)];
            if(aux==0){ok=1;
            v1[h1(x,n)]=x;}
            else if(aux2==0){ok=1;
            v2[h2(x,n)]=x;}
            else{
                aux3=aux2;
                v2[h2(x,n)]=v1[h1(x,n)];
                v1[h1(x,n)]=x;
                x=aux3;
                if(s==x)rehash(v1,v2,n);
            }
    }
}
}

void stergere(int *v1,int *v2,int x, int n){
if(cautare(v1,v2,x,n)==1){
    if(v1[h1(x,n)]==x)v1[h1(x,n)]=0;
    if(v2[h2(x,n)]==x)v2[h2(x,n)]=0;
}
}
int main(){
int n,*v1,*v2,i,op,x;
ifstream f("hashuri.in");
ofstream g("hashuri.out");
f>>n;
aloca(v1,v2,n);
reset(n);
for(i=1;i<=n;i++){
		f>>op>>x;
        if(op==1)inserare(v1,v2,x,n);
        if(op==2)stergere(v1,v2,x,n);
        if(op==3){
                if(cautare(v1,v2,x,n)==1)
                    g<<1<<"\n";
                else g<<0<<"\n";
        }
    }		
}