Cod sursa(job #2404823)

Utilizator Robert_VRVRobert Vadastreanu Robert_VRV Data 13 aprilie 2019 14:03:11
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>

const int SIGMA = 26;

int ch(const char& c) {
  return c - 'a';
}

struct Trie {
  int ends;
  int frecv;
  Trie* son[SIGMA];
  Trie() {
    ends = 0;
    frecv = 0;
    for (int i = 0; i < SIGMA; i++)
      son[i] = NULL;
  }
};

Trie *T = new Trie;

void insertTrie(Trie *T, char *s) {
 T->frecv++;
  if (s[0] == '\0') {
    T->ends++;
  } else {
    int c = ch(s[0]);
    if (T->son[c] == NULL)
      T->son[c] = new Trie;
    insertTrie(T->son[c], s + 1);
  }
}

void deleteTrie(Trie *T, char *s) {
  T->frecv--;
  if (s[0] == '\0') {
    T->ends--;
  } else {
    int c = ch(s[0]);
    deleteTrie(T->son[c], s + 1);
    if (T->son[c]->frecv == 0)
      T->son[c] = NULL;
  }
}

int getFrecv(Trie *T, char *s) {
  if (s[0] == '\0')
    return T->ends;
  else {
    if (T == NULL)
      return 0;
    else
      return getFrecv(T->son[ch(s[0])], s + 1);
  }
}

int maxPref(Trie *T, char *s) {
  if (s[0] == '\0')
    return 0;
  else {
    int c = ch(s[0]);
    if (T->son[c] != NULL)
      return 1 + maxPref(T->son[c], s + 1);
    return 0;
  }
}

int main() {

  std::ifstream fin("trie.in");
  std::ofstream fout("trie.out");

  int tip;
  while (fin >> tip) {
    char s[2 + 20];
    fin >> s;
    if (tip == 0) {
      insertTrie(T, s);
    } else if (tip == 1) {
      deleteTrie(T, s);
    } else if (tip == 2) {
      fout << getFrecv(T, s) << '\n';
    } else if (tip == 3) {
      fout << maxPref(T, s) << '\n';
    }
  }

  return 0;
}