Cod sursa(job #912437)

Utilizator vladm97Matei Vlad vladm97 Data 12 martie 2013 13:47:57
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 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=0;i<n;i++){
        if(v3[i]!=0)inserare(v3[i],n);
        if(v4[i]!=0)inserare(v4[i],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(){
	srand(time(NULL));
    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";
        }
    }       
}