Cod sursa(job #1700239)

Utilizator stoianmihailStoian Mihail stoianmihail Data 9 mai 2016 21:17:31
Problema Hashuri Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.46 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define Dragoste 4096
#define SIGMA 10
#define NIL -1

struct trie {
  int count, numSons;
  trie *sons[SIGMA];

  trie() {
    this -> count = 0;
    this -> numSons = 0;
    memset(this -> sons, NULL, sizeof(this -> sons));
  }
};

trie *root;
char d[SIGMA + 1];

char buff[Dragoste];
int pos = Dragoste;

char getChar(FILE *f) {
  if (pos == Dragoste) {
    fread(buff, 1, Dragoste, f);
    pos = 0;
  }
  return buff[pos++];
}

int freef(FILE *f) {
  int result = 0;
  char c;

  do {
    c = getChar(f);
  } while (!isdigit(c));
  do {
    result = (result << 3) + (result << 1) + c - '0';
    c = getChar(f);
  } while (isdigit(c));
  return result;
}

void insert(trie* &nod, int ptr) {
  if (d[ptr] == '\0') {
    nod -> count = 1;
    return;
  }

  if (nod -> sons[d[ptr] - '0'] == NULL) {
    nod -> sons[d[ptr] - '0'] = new trie;
    nod -> numSons++;
  }
  insert(nod -> sons[d[ptr] - '0'], ptr + 1);
}

int erase(trie* &nod, int ptr) {
  if (d[ptr] == '\0') {
    nod -> count = 0;
  } else if (erase(nod -> sons[d[ptr] - '0'], ptr + 1) == 1) {
    nod -> sons[d[ptr] - '0'] = NULL;
    nod -> numSons--;
  }
  if (nod != root && nod -> numSons == 0 && nod -> count == 0) {
    delete nod;
    return 1;
  }
  return 0;
}

int find(trie* &nod, int ptr) {
  if (d[ptr] == '\0') {
    return 1;
  }
  return nod -> sons[d[ptr] - '0'] == NULL ? 0 : find(nod -> sons[d[ptr] - '0'], ptr + 1);
}

int main(void) {
  int size;
  char c, task;
  FILE *f = fopen("hashuri.in", "r");
  freopen("hashuri.out", "w", stdout);

  root = new trie;

  //fprintf(stderr, "%d\n", root -> count);

  //fprintf(stderr, "amin");

  int N = freef(f);
  while (N) {
    task = getChar(f);
    getChar(f);

    size = 0;
    c = getChar(f);
    do {
      d[size++] = c;
      c = getChar(f);
    } while (c != '\n');
    d[size] = '\0';
   // fprintf(stderr, "Operatie: %d -> %s\n", N, d);

    if (task == '1') {
    //fprintf(stderr, "ma %s\n", d);
      insert(root, 0);
     // fprintf(stderr, "Adauga\n");
     // fprintf(stderr, "1");
    } else if (task == '2') {
      //fprintf(stderr, "sterge\n");
      if (find(root, 0)) {
       // fprintf(stderr, "Nu intra");
        erase(root, 0);
      }
          //  fprintf(stderr, "2");
    } else if (task == '3') {
      fprintf(stdout, "%d\n", find(root, 0));
          //fprintf(stderr, "3");
    }
    N--;
  }
  fclose(f);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}