Cod sursa(job #3139737)

Utilizator vladrochianVlad Rochian vladrochian Data 1 iulie 2023 10:54:44
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>

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

struct Node {
  int cnt_node, cnt_subtree;
  Node* children[26];

  Node() : cnt_node(0), cnt_subtree(0), children{} {}
};

void insert(Node* node, const char* w) {
  node->cnt_subtree += 1;
  if (*w == '\0') {
    node->cnt_node += 1;
    return;
  }
  int c = *w - 'a';
  if (node->children[c] == nullptr) {
    node->children[c] = new Node();
  }
  insert(node->children[c], w + 1);
}

void erase(Node* node, const char* w) {
  node->cnt_subtree -= 1;
  if (*w == '\0') {
    node->cnt_node -= 1;
    return;
  }
  int c = *w - 'a';
  erase(node->children[c], w + 1);
  if (node->children[c]->cnt_subtree == 0) {
    delete node->children[c];
    node->children[c] = nullptr;
  }
}

int cnt(Node* node, const char* w) {
  if (*w == '\0') {
    return node->cnt_node;
  }
  int c = *w - 'a';
  if (node->children[c] == nullptr) {
    return 0;
  }
  return cnt(node->children[c], w + 1);
}

int longest_common_prefix(Node* node, const char* w) {
  if (*w == '\0') {
    return 0;
  }
  int c = *w - 'a';
  if (node->children[c] == nullptr) {
    return 0;
  }
  return longest_common_prefix(node->children[c], w + 1) + 1;
}

int main() {
  Node* root = new Node();
  int op;
  char w[25];
  while (fin >> op >> w) {
    switch (op) {
      case 0:
        insert(root, w);
        break;
      case 1:
        erase(root, w);
        break;
      case 2:
        fout << cnt(root, w) << "\n";
        break;
      case 3:
        fout << longest_common_prefix(root, w) << "\n";
        break;
    }
  }
  return 0;
}