Cod sursa(job #912148)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 12 martie 2013 09:37:00
Problema Hashuri Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
#include <fstream>
#include <time.h>
#include <stdlib.h>
#include <iostream>
#define RM 29
#define C1 911237
#define C2 812041
#define T1  69787
#define T2 123123
#define SZ 1001000
using namespace std;


int Disp1, Disp2;

inline void Generate()
{
    Disp1 = C1 + rand()%T1;
    Disp2 = C2 + rand()%T2;
}

inline int F1(int nr)
{
    return nr%Disp1;
}

inline int F2(int nr)
{
    return nr%Disp2;
}

inline bool adauga(int nr, int *Hash1, int *Hash2)
{
    int i,aux;
    for(i=1;i<=RM;i++)
    {
        if(Hash1[F1(nr)] == 0)
        {
            Hash1[F1(nr)] = nr;
            return 1;
        }
        else if(Hash2[F2(nr)] ==0)
        {
            Hash2[F2(nr)] = nr;
            return 1;
        }
        else
        {
            aux = Hash2[F2(nr)];
            Hash2[F2(nr)] = nr;
            nr = aux;
        }
    }
    return 0;
}

inline bool sterge(int nr, int *Hash1, int *Hash2)
{
    int v1 = F1(nr), v2 = F2(nr);
    if(Hash1[v1] == nr)
    {
        Hash1[v1] = 0;
        return 1;
    }
    if(Hash2[v2] == nr)
    {
        Hash2[v2] = 0;
        return 1;
    }
    return 0;
}

inline bool exista(int nr, int *Hash1, int *Hash2)
{
    int v1 = F1(nr), v2 = F2(nr);
    if(Hash1[v1] == nr || Hash2[v2] == nr)
        return 1;
    return 0;
}

void Rehash(int *Hash1, int *Hash2)
{
    //delete Hash1;
    //delete Hash2;
    Generate();
    //Hash1 = new int[Disp1+4];
    //Hash2 = new int[Disp2+4];
    fill(Hash1,Hash1+Disp1+2,0);
    fill(Hash2,Hash2+Disp2+2,0);
    //for(int i=1;i<=SZ-77;i++)Hash1[i] = Hash2[i] = 0;
}

int main()
{
    int N,op,x;
    bool okay = 1;
    srand(time(NULL));
    Generate();
    int *Hash1 = new int[SZ+2];
    int *Hash2 = new int[SZ+2];
    while(okay)
    {
        ifstream in("hashuri.in");
        ofstream out("hashuri.out");
        in>>N;
        okay = 0;
        while(N--&&!okay)
        {
            in>>op>>x;
            if(op==1)
            {
                if(!exista(x,Hash1,Hash2))
                    if(!adauga(x,Hash1,Hash2))
                    {
                        Rehash(Hash1,Hash2);
                        okay = 1;
                    }
            }
            if(op==2)
                sterge(x,Hash1,Hash2);
            if(op==3)
            {
                if(exista(x,Hash1,Hash2))
                    out<<"1\n";
                else out<<"0\n";
            }
        }
        in.close();
        out.close();
    }
    return 0;
}