Cod sursa(job #1499691)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 10 octombrie 2015 23:27:48
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int HASH_SIZE = 1000000;


struct nod
{
    int val = 0;
    nod *adr = 0;
} *Hash[HASH_SIZE];

const double A = 0.618034;

int frac(double x)
{
    if(x>1) return x - (int)x;
    if(x<1&&x>=0) return x;
    return (int)x - x;
}


int h(int x)
{
    return HASH_SIZE * frac(x*A);
}

int cautare(int x)
{
    for(nod *q = Hash[h(x)]; q ; q = q->adr)
        if(q->val == x)
                return 1;
    return 0;
}



void adaugare(int x)
{
    int index = h(x);
    nod *p = Hash[index];

    if(p == NULL)
    {
        p = new nod;
        p ->val = x;
        p ->adr = 0;
        Hash[index] = p;
        return;
    }

    if(p -> val == x)
        return;

    nod *q;
    for(q = p; q->adr ; q = q->adr)
        if(q->adr->val == x)
            return;

    nod *r = new nod;
    r->adr = 0;
    r->val = x;
    q->adr = r;

}

void stergere(int x)
{
    int index = h(x);
    nod *p = Hash[index];

    if(p==NULL)
    {
        return;
    }
    if(p->val == x)
    {
        p = p->adr;
        return;
    }
    nod *q;
    for(q = p; q->adr ; q = q->adr)
        if(q->adr->val == x)
            {
                q->adr = q->adr->adr;
                return;
            }
}

int main()
{
    freopen("hashuri.in","r",stdin);
    freopen("hashuri.out","w",stdout);
    int n,op,x;
    scanf("%d",&n);

    for(int i = 1; i<=n; i++)
    {

        scanf("%d%d",&op,&x);
        if(op == 1)
        {
            adaugare(x);
        }
        else if(op == 2)
        {
            stergere(x);
        }
        else if(op == 3)
        {
        printf("%d\n", cautare(x));
        }
    }



    return 0;
}