Cod sursa(job #306509)

Utilizator utcistuBarcau Tomsa utcistu Data 21 aprilie 2009 01:07:56
Problema Hashuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.89 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define nMax 1000001

int empty[nMax];

int hFct(int x,int i)
{
    return (x+((i*i)%nMax)*(1+x%999997))%nMax;
}

void hInsert(int *hTable,int x)
{
    int i,crt;
    for (i=0;i<nMax;i++)
    {
        crt=hFct(x,i);
        if ((hTable[crt]==0)||(empty[crt]))
        {
            hTable[crt]=x;
            empty[crt]=0;
            break;
        }
        else if ((hTable[crt]==x)&&(empty[crt]==0))
        {
            break;
        }
    }
}

void hDelete(int *hTable,int x)
{
    int i,crt;
    for (i=0;i<nMax;i++)
    {
        crt=hFct(x,i);
        if ((hTable[crt]==x)&&(empty[crt]==0))
        {
            empty[crt]=1;
            break;
        }
        else if ((hTable[crt]==0)&&(empty[crt]==0))
        {
            break;
        }
    }
}

int hFind(int *hTable,int x)
{
    int i,crt;
    for (i=0;i<nMax;i++)
    {
        crt=hFct(x,i);
        if ((hTable[crt]==x)&&(empty[crt]==0))
        {
            return 1;
        }
        else if (hTable[crt]==0)
        {
            return 0;
        }
    }
    return 0;
}

int main()
{
    FILE *fin,*fout;
    fin=fopen("hashuri.in","r");
    fout=fopen("hashuri.out","w");
    int i,x,*hTable;
    int cmd,n;
    hTable=(int *)malloc(sizeof(int)*nMax);
    memset(hTable,'\0',sizeof(int)*nMax);
    fscanf(fin,"%d",&n);
    for (i=0;i<n;i++)
    {
        fscanf(fin,"%d %d",&cmd,&x);
        printf("%d %d\n",cmd,x);
        switch (cmd)
        {
            case 1:hInsert(hTable,x);
            break;
            case 2:hDelete(hTable,x);
            break;
            case 3:if (hFind(hTable,x))
            fputs("1\n",fout);
            else
            fputs("0\n",fout);
            break;
            default:
            break;
        }
    }
    fclose(fin);
    fclose(fout);
}