Cod sursa(job #1567841)

Utilizator tudorcomanTudor Coman tudorcoman Data 13 ianuarie 2016 19:31:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb

#include <cstdio>

const int Sigma = 26;

class Trie {
public:
  int ap;
  Trie* fii[Sigma + 3];
  int nSons;

  Trie() {
    for(int i = 0; i <= Sigma; ++ i)
      fii[i] = NULL;
    ap = nSons = 0;
  }

  void insert(const char* const word) {
    if (!word[0]) {
      ++ ap;
    } else {
      int first = word[0] - 'a';
      if (fii[first] == NULL)
        fii[first] = new Trie();
      fii[first]->insert(word + 1);
    }
    ++ nSons;
  }

  int wordQuery(const char* const word) {
    if(!word[0]) {
      return ap;
    } else {
      int first = word[0] - 'a';
      if (fii[first] == NULL)
        return 0;
      else
        return fii[first]->wordQuery(word + 1);
    }
  }

  int prefixQuery(const char* const word) {
    if(!word[0]) {
      return 0;
    } else {
      int first = word[0] - 'a';
      if (fii[first] == NULL)
        return 0;
      else
        return fii[first]->prefixQuery(word + 1) + 1;
    }
  }

  void erase(const char* const word) {
    if(!word[0]) {
      -- ap;
    } else {
      int first = word[0] - 'a';
      fii[first]->erase(word + 1);
      if(!fii[first]->nSons) {
        delete fii[first];
        fii[first] = NULL;
      }
    }
    -- nSons;
  }
};

Trie* lambda = new Trie();

int main() {
  freopen("trie.in", "r", stdin);
  freopen("trie.out", "w", stdout);

  int op;
  char word[32];

  while(scanf("%d %s", &op, word) == 2) {
    switch(op) {
      case 0: lambda->insert(word); break;
      case 1: lambda->erase(word); break;
      case 2: printf("%d\n", lambda->wordQuery(word)); break;
      case 3: printf("%d\n", lambda->prefixQuery(word)); break;
    }
  }
  return 0;
}