Cod sursa(job #938565)

Utilizator SovStoStoicescu Mihail Cristian SovSto Data 12 aprilie 2013 21:13:04
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 3.28 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)(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;
}