Cod sursa(job #912213)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 12 martie 2013 10:24:22
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <time.h>
#include <stdlib.h>
#define RM 79
#define C1 1411237
#define C2 1212041
#define T1 370000
#define T2 680000
#define SZ 2000000
using namespace std;

ifstream in("hashuri.in");
ofstream out("hashuri.out");

int Disp1, Disp2;

inline void Swap(int &a, int &b){int aux = b; b = a; a = aux;}

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;
        }
        Swap(nr,Hash1[F1(nr)]);
        if(Hash2[F2(nr)] ==0)
        {
            Hash2[F2(nr)] = nr;
            return 1;
        }
        Swap(nr,Hash2[F2(nr)]);
    }
    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 K,bool *Op,int *NR,int *Hash1, int *Hash2)
{
    delete Hash1;
    delete Hash2;
    Generate();
    Hash1 = new int[Disp1+4];
    Hash2 = new int[Disp2+4];
    for(int i=1;i<=K;i++)
    {
        if(Op[i])
        {
            if(!exista(NR[i],Hash1,Hash2))
             if(!adauga(NR[i],Hash1,Hash2))
                Rehash(K,Op,NR,Hash1,Hash2);
        }
        else sterge(NR[i],Hash1,Hash2);
    }
}

int main()
{
    int N,op,x;
    in>>N;
    srand(time(NULL));
    Generate();
    int *Hash1 = new int[Disp1+4];
    int *Hash2 = new int[Disp2+4];
    bool Op[N];int NR[N], K=0;
    while(N--)
    {
        in>>op>>x;
        if(op==1)
        {
            Op[++K] = 1,NR[K] = x;
            if(!exista(x,Hash1,Hash2))
                if(!adauga(x,Hash1,Hash2))
                    Rehash(K,Op,NR,Hash1,Hash2);
        }
        if(op==2)
            Op[++K] = 0,NR[K] = x,sterge(x,Hash1,Hash2);
        if(op==3)
            out<<exista(x,Hash1,Hash2)<<'\n';
    }
    in.close();
    out.close();
    return 0;
}