Cod sursa(job #902453)

Utilizator maritimCristian Lambru maritim Data 1 martie 2013 14:21:13
Problema Hashuri Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
#include<stdio.h>
#include<assert.h>

#define M 2077777
#define H1 177777
#define H2 111333

inline int h1(int a)
{
    return (1LL*H1*a+H2)%M;
}

inline int h2(int a)
{
    return (1LL*H2*a+H1)%M;
}

inline void initializare(int *p)
{
    int i;

    for(i=0;i<M;i++)
        *(p+i) = 0;
}

inline int exist(int *p,int x)
{
    if(*(p+h1(x)) == x || *(p+h2(x)) == x)
        return 1;
    return 0;
}

inline void rehash(int *p,int x)
{
    int hash2 = h2(x),y;

    if(*(p+hash2) != 0)
    {
        y = *(p+hash2);
        *(p+hash2) = x;
        rehash(p,y);
    }
}

inline void add(int *p,int x)
{
    if(exist(p,x))
        return ;

    int hash1 = h1(x),y;

    if(*(p+hash1) != 0)
    {
        assert(1==2);
        y = *(p+hash1);
        *(p+hash1) = x;
    //    printf("rehash\n");
        rehash(p,y);
    }
    else
        *(p+hash1) = x;
}

inline void sterge(int *p,int x)
{
    int hash1 = h1(x),hash2 = h2(x);

    if(*(p+hash1) == x)
        *(p+hash1) = 0;
    else if(*(p+hash2) == x)
        *(p+hash1) = 0;
}

void main()
{
    FILE *f = fopen("hashuri.in","r");
    FILE *g = fopen("hashuri.out","w");
    int *p;
    int N,op,a;

    p = (int*)malloc(M*sizeof(int));

    initializare(p);

    int i;

    fscanf(f,"%d",&N);
    for(i=1;i<=N;i++)
    {
        fscanf(f,"%d %d",&op,&a);
        switch(op)
        {
            case 1 : add(p,a);
                break;
            case 2 : sterge(p,a);
                break;
            case 3 : fprintf(g,"%d\n",exist(p,a));
        }
    }

    fclose(f);
    fclose(g);

//    for(i=0;i<M;i++)
//        printf("%d\n",*(p+i));
}