Cod sursa(job #1413549)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 1 aprilie 2015 22:27:54
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.91 kb
#include <stdio.h>
#include <assert.h>

#define MOD 666013
#define NIL -1

unsigned h[2][MOD][5];

inline unsigned hash1(unsigned x) {
  return x - x / MOD * MOD;
}
inline unsigned hash2(unsigned x) {
  x = ((x >> 16) ^ x) * 0x45d9f3b;
  x = ((x >> 16) ^ x) * 0x45d9f3b;
  x = ((x >> 16) ^ x);
  return x - x / MOD * MOD;
}
inline void hashInsert(unsigned x) {
  unsigned h0 = hash1(x);
  unsigned h1 = hash2(x);

  if (h[0][h0][0] <= h[1][h1][0]) {
    assert(h[0][h0][0] < 4);
    h[0][h0][++h[0][h0][0]] = x;
  } else {
    assert(h[1][h1][0] < 4);
    h[1][h1][++h[1][h1][0]] = x;
  }
}
inline void hashRemove(unsigned x) {
  unsigned h0 = hash1(x);
  unsigned h1 = hash2(x);
  unsigned i;

  i = 0;
  while ((i <= h[0][h0][0]) && (h[0][h0][i] != x)) {
    i++;
  }
  if (i <= h[0][h0][0]) {
    for (; i < h[0][h0][0]; i++) {
      h[0][h0][i] = h[0][h0][i + 1];
    }
    h[0][h0][0]--;
  } else {
    i = 0;
    while ((i <= h[1][h1][0]) && (h[1][h1][i] != x)) {
      i++;
    }
    if (i <= h[1][h1][0]) {
      for (; i < h[1][h1][0]; i++) {
        h[1][h1][i] = h[1][h1][i + 1];
      }
      h[1][h1][0]--;
    }
  }
}
inline bool hashFind(unsigned x) {
  unsigned h0 = hash1(x);
  unsigned h1 = hash2(x);
  unsigned i;

  i = 0;
  while ((i <= h[0][h0][0]) && (h[0][h0][i] != x)) {
    i++;
  }
  if (i <= h[0][h0][0]) {
    return 1;
  }
  i = 0;
  while ((i <= h[1][h1][0]) && (h[1][h1][i] != x)) {
    i++;
  }
  return (i <= h[1][h1][0]);
}
int main(void) {
  FILE *f, *g;
  unsigned query, x;
  register unsigned i;

  f = fopen("hash.in", "r");
  fscanf(f, "%u ", &query);
  g = fopen("hash.out", "w");
  for (i = 0; i < query - 3; i += 4) {
    char c = fgetc(f);
    fscanf(f, "%u ", &x);
    switch (c) {
    case '1':
      hashInsert(x);
      break;
    case '2':
      hashRemove(x);
      break;
    case '3':
      fputc(hashFind(x) + '0', g);
      fputc('\n', g);
      break;
    }
    c = fgetc(f);
    fscanf(f, "%u ", &x);
    switch (c) {
    case '1':
      hashInsert(x);
      break;
    case '2':
      hashRemove(x);
      break;
    case '3':
      fputc(hashFind(x) + '0', g);
      fputc('\n', g);
      break;
    }
    c = fgetc(f);
    fscanf(f, "%u ", &x);
    switch (c) {
    case '1':
      hashInsert(x);
      break;
    case '2':
      hashRemove(x);
      break;
    case '3':
      fputc(hashFind(x) + '0', g);
      fputc('\n', g);
      break;
    }
    c = fgetc(f);
    fscanf(f, "%u ", &x);
    switch (c) {
    case '1':
      hashInsert(x);
      break;
    case '2':
      hashRemove(x);
      break;
    case '3':
      fputc(hashFind(x) + '0', g);
      fputc('\n', g);
      break;
    }
  }
  for (; i < query; i++) {
    char c = fgetc(f);
    fscanf(f, "%u ", &x);
    switch (c) {
    case '1':
      hashInsert(x);
      break;
    case '2':
      hashRemove(x);
      break;
    case '3':
      fputc(hashFind(x) + '0', g);
      fputc('\n', g);
      break;
    }
  }
  fclose(f);
  fclose(g);
  return 0;
}