Cod sursa(job #907746)

Utilizator vladm97Matei Vlad vladm97 Data 8 martie 2013 11:49:01
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <fstream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

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 &a1,int &a2,int n){
a1=rand()%n;
a2=rand()%n;
}

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

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

int h2(int a2,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,int a1,int a2){
if((v1[h1(a1,x,n)]==x)||(v2[h2(a2,x,n)]==x))return 1;
return 0;
}

void inserare(int *v1,int *v2,int x,int n,int &a1,int &a2){
if(cautare(v1,v2,x,n,a1,a2)==0){
int ok=0,s=v1[h1(a1,x,n)],aux,aux2,aux3;
    if(v1[h1(a1,x,n)]==0){v1[h1(a1,x,n)]=x;
    ok=1;}
    else if(v2[h2(a2,x,n)]==0){v2[h2(a2,x,n)]=x;
    ok=1;}
    while(ok==0){
            aux=v1[h1(a1,x,n)];
            aux2=v2[h2(a2,x,n)];
            if(aux==0){ok=1;
            v1[h1(a1,x,n)]=x;}
            else if(aux2==0){ok=1;
            v2[h2(a2,x,n)]=x;}
            else{
                aux3=aux2;
                v2[h2(a2,x,n)]=v1[h1(a1,x,n)];
                v1[h1(a1,x,n)]=x;
                x=aux3;
                if(s==x)rehash(v1,v2,n,a1,a1);
            }
    }
}
}

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