Cod sursa(job #1761453)

Utilizator BarbumateiBarbu Matei Barbumatei Data 22 septembrie 2016 11:48:01
Problema Hashuri Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.02 kb
#include <stdio.h>
#include <stdlib.h>
#define MOD 798496
#define h(x) (x%MOD)

int val[1000001], next[1000001], lista[MOD];

inline void insert(int p, int x){

  val[p]=x;///marcam in vectorul de valori ca pe pozitia p se afla x

  next[p]=lista[h(x)];///vom avea o lista simplu inlantuita in care pe pozitia p
  ///vom retine care era ultima valoarea aflata in vectorul lista pe poztia pe h(x)
  ///ca apoi sa inseram in lista[h(x)] alta valoarea

  lista[h(x)]=p;///pe valori de la 0 la mod-1 noi cand apelam h(x) va returna o valore y,
  ///noi vom retine in vectorul lista care este pozitia ultimul element care prelucrat prin hash
  ///a avut valoarea y, deci mai precis lista[y]=pozitia ultimului element care a returnat prin hash y

}

inline int cauta(int x){

  int poz;
  poz=lista[h(x)];///poz=valoarea indicelui ultimului element care a avut aceeasi cheie hash ca si x

  while(poz && val[poz]!=x)///cat timp nu nimerim cu indicele pe 0 (indexam de la 1), si valoarea actuala nu e x
    poz=next[poz];///ne ducem la urmatorul indice care a avut o valoare cu acelasi cheie hash ca si x

  return (poz>0);

}

inline void sterge(int x){

  int poz=lista[h(x)];
  if(val[poz]==x){
    lista[h(x)]=next[poz];
  }
  else{
    while(next[poz] && val[next[poz]]!=x)///cat timp nu urmeaza 0 si valoarea a ce urmeaza nu e x
      poz=next[poz];///ne ducem la urmatorul indice cu aceeasi cheie hash ca si x
    if(val[next[poz]]==x){///daca valoarea a ce urmeaza este x
      next[poz]=next[next[poz]];///atunci stergem aceasta valoarea ducandu-ne la urmatoarea din lista inlantuita
    }
  }
}

int main(){
  int n, i, t, x;
  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", &t, &x);
    if(t==1){
      if(cauta(x)==0)
        insert(i, x);
    }
    else if(t==2){
      sterge(x);
    }
    else fprintf(fout, "%d\n", cauta(x));
  }
  fclose(fin);
  fclose(fout);
    return 0;
}