Cod sursa(job #904663)

Utilizator chimistuFMI Stirb Andrei chimistu Data 4 martie 2013 18:16:37
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <cstdlib>
using namespace std;

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

int func1 (int k, int val)
{
    return val%k;
}

int func2 (int k, int val)
{
    return (val/k)%k;
}

int cauta(int val, int k, int *hash1, int *hash2)
{
        if (hash1[func1(k,val)]==val || hash2[func2(k,val)]==val)
            return 1;
        else
            return 0;
}

void sterge(int val,int k, int *hash1, int *hash2)
{
    if (hash1[func1(k,val)]==val)
        hash1[func1(k,val)]=0;
    else
        if (hash2[func2(k,val)]==val)
            hash2[func2(k,val)]=0;
}

void insereaza(int val, int k, int *hash1, int *hash2 )
{
    if (cauta(val,k,hash1,hash2)==1)
        return;
    else
    {
        int x = func1(k,val);
        int y = func2(k,val);
        int i=0,aux;
        while (i<10)
        {
            if (hash1[x] == 0)
            {
                hash1[x] = val;
                i=10;
                return;
            }
            aux=hash1[x];
            hash1[x]=val;
            val=aux;
            if (hash2[y] == 0)
            {
                hash2[y] = val;
                i=10;
                return;
            }
            aux=hash2[y];
            hash2[y]=val;
            val=aux;
            i--;
            }
        }
}




int main()
{
    int k=979457;
    int *hash1 = (int*)calloc(k,sizeof(int));
    int *hash2 = (int*)calloc(k,sizeof(int));
    int n,op,val;
    f>>n;
    while (n>0)
    {
        f>>op>>val;
        if (op==1)
            insereaza(val,k, hash1, hash2);
        if (op==2)
            sterge(val, k, hash1, hash2);
        if (op==3)
            if (cauta(val,k,hash1,hash2)==0)
                g << 0 << "\n";
            else
                g << 1 << "\n";
        n--;
    }
}