Cod sursa(job #938551)

Utilizator SovStoStoicescu Mihail Cristian SovSto Data 12 aprilie 2013 21:00:16
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.27 kb
#include <fstream>
#include <string.h>
#include <time.h>
#include <stdlib.h>
using namespace std;


 class prototip
 {
     public:
    int *hash1;
    int *hash2;
    int fact1;
    int fact2;
    int size;
    int prim;
    char *filein,*fileout;

    void aloca();
    int inserare(int x);
    void golire();
    void randomiz();
    int funct1(int x);
    int funct2(int x);
    void stergere(int x);
    int cautare(int x);
    void rehash(int j);
    void operatii();
 };
class hash: public prototip
{


public:


    void operatii()
{
    srand(time(NULL));
    randomiz();
    golire();
    ifstream f(filein);
    ofstream g(fileout);

    int n,x,op;
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>op>>x;
        if((op==1)&&(inserare(x)==0))rehash(i);
        if(op==2)   if(cautare(x)==1)stergere(x);
        if(op==3)
                    {
                        if(cautare(x)==1)
                            g<<1<<"\n";
                        else g<<0<<"\n";
                    }
    }
}



void aloca()
{
    size=1000000;
    hash1=(int*)calloc(size,sizeof(int));
    hash2=(int*)calloc(size,sizeof(int));
}

void golire()
{
    for(int i=1;i<size;i++)
        {
            hash1[i]=0;
            hash2[i]=0;
        }
}


int funct1(int x)
{
    int c;
    c=(((long long) x*(long long)(fact1%10)+(long long)x%fact2)+(long long)x*5)%size;
    return c;
}

int funct2(int x)
{
    int c;
    c=(((long long)x*((long long)(fact1%10))%prim)+(long long)x*(long long)(fact1%10))%size;
    return c;
}

void randomiz()
{
    fact1=rand()%prim;
    fact2=rand()%prim;
}


int cautare(int x)
{
    if(hash1[funct1(x)]==x)return 1;
    if(hash2[funct2(x)]==x)return 1;
    return 0;
}


int inserare(int x)
{
    if(cautare(x)==1)return 1;
    int k=0,aux;
    while(k<30)
    {
        if(hash1[funct1(x)]==0)
        {
            hash1[funct1(x)]=x;
            return 1;
        }
        else
            if(hash2[funct2(x)]==0)
            {
                hash2[funct2(x)]=x;
                return 1;
            }
        else
        {

            k++;
            if(k%2==1)
            {
            aux=hash1[funct1(x)];
            hash1[funct1(x)]=x;
            x=aux;
            }
            else
            {
                aux=hash2[funct2(x)];
                hash2[funct2(x)]=x;
                x=aux;
            }
        }
    }
    return 0;
}

void stergere(int x)
{

    if(hash1[funct1(x)]==x)hash1[funct1(x)]=0;
    if(hash2[funct2(x)]==x)hash2[funct2(x)]=0;
}


void rehash(int j)
{
    golire();
    randomiz();
    int op,x;
    ifstream f(filein);
    f>>op;
    for(int i=1;i<=j;i++)
    {
        f>>op>>x;
        if((op==1)&&(inserare(x)==0))rehash(j);
            if((op==2)&&(cautare(x)==1))stergere(x);

    }

}


hash(char *in,char *out)
{
    aloca();
    prim=20547;
    filein=new char[strlen(in)];
    fileout=new char[strlen(out)];
    strcpy(filein,in);
    strcpy(fileout,out);
}

~hash()
{
    delete[] hash1;
    delete[] hash2;
    delete[] filein;
    delete[] fileout;
}
};




main()
{
    hash coocko("hashuri.in","hashuri.out");
    coocko.operatii();
    return 0;
}