Cod sursa(job #1763738)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 24 septembrie 2016 15:59:56
Problema Hashuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.91 kb
#include <stdio.h>
#define nmax 1000000
#define mod 702113
int val[nmax];        ///val retine valorile date
int next[nmax];      ///next retine elementul anterior ce a avut acelasi hash cu cel actual
int lasthash[mod];  ///pozitia ultimului element ce a avut acel hash

inline void adauga( int poz, int nr ){
    val[poz] = nr;                 ///adaugam elementul in vectorul de valori
    next[poz] = lasthash[nr%mod];  ///memoram in lista pozitia ultimului element cu acest cod hash
    lasthash[nr%mod] = poz;        ///stocam ultima pozitie a nr cu acel hash
}

int cauta( int nr ){
    int poz = lasthash[ nr%mod ];   ///luam ultima aparitie a nr cu acel hash
    while( poz!=0 && val[poz]!=nr )
        poz = next[poz];            ///si mergem pana gasim elementul cautat sau ajungem la sfarsit
    return (poz>0);         ///daca suntem la sfarsit returnam 0, altfel 1
}

inline void sterge( int nr ){
    int poz;
    poz = lasthash[nr%mod];
    if( val[poz]==nr )
        lasthash[nr%mod] = next[poz];   ///daca acest nr este ultimul introdus cu hashuri respectiv
    else{
        while( val[ next[poz] ]!=nr && next[poz]!=0 )   ///altfel cautam ultima pozitie dinainte aparitie elementului
            poz = next[poz];
        if( val[ next[poz] ]==nr )      ///daca urmatorul element este cel cautat, il eliminam
            next[poz] = next[ next[poz] ];
    }

}

int main()
{
    int n, i, ver, nr;
    FILE *fin, *fout;
    fin = fopen( "hashuri.in", "r" );
    fout = fopen( "hashuri.out", "w" );
    fscanf( fin, "%d", &n );
    for( i=1; i<=n; i++ ){
        fscanf( fin, "%d%d", &ver, &nr );
        if( ver==1 ){
            if( cauta(nr)== 0 )
                adauga( i, nr );
        }
        else if( ver==2 ){
            sterge(nr);
        }
        else
            fprintf( fout, "%d\n", cauta(nr) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}