Cod sursa(job #2924634)

Utilizator Asgari_ArminArmin Asgari Asgari_Armin Data 6 octombrie 2022 21:09:50
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>

using namespace std;

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

const int SIGMA = 26;
struct Node{
  int freq = 0, fullWords = 0;
  vector <Node*> v;

  Node() : v(SIGMA, nullptr) {}
};

struct Trie {
  private:
    Node* root_ = nullptr;
    Node* insert_ (char *s, Node *node);
    Node* erase_ (char *s, Node *node);
    int query_(char *s, Node *node);
    int prefix_(char *s, Node *node);
  public:
    void insert (char *s) { root_ = insert_(s, root_); }
    void erase (char *s) { root_ = erase_(s, root_); }
    int query (char *s) { return query_(s, root_); }
    int prefix (char *s) { return prefix_(s, root_); }
};
Trie trie;

Node* Trie::insert_ (char *s, Node *node) {
  if (node == nullptr)
    node = new Node();

  ++node->freq;

  if (s[0] == '\0')
    ++node->fullWords;
  else
    node->v[s[0] - 'a'] = insert_(s + 1, node->v[s[0] - 'a']);

  return node;
}

Node* Trie::erase_ (char *s, Node *node) {
  if (node == nullptr)
    return node;

  --node->freq;

  if (s[0] == '\0')
    --node->fullWords;
  else
    node->v[s[0] - 'a'] = erase_ (s + 1, node->v[s[0] - 'a']);

  if (node->freq == 0) {
    delete node;
    node = nullptr;
  }
  return node;
}

int query_ (char *s, Node *node) {
  if (node == nullptr)
    return 0;
  if (s[0] == '\0')
    return node->fullWords;
  return query_(s + 1, node->v[s[0] - 'a']);
}

int prefix_ (char *s, Node *node) {
  if (node == nullptr || s[0] == '\0')
    return 0;
  if (node->v[s[0] - 'a'] == nullptr)
    return 0;
  return 1 + prefix_ (s + 1, node->v[s[0] - 'a']);
}

int main() {
  int op;
  char s[50];

  while (fin >> op >> s) {
    if (op == 0)
      trie.insert(s);
    else if(op == 1)
      trie.erase(s);
    else if (op == 2)
      cout << trie.query(s) << "\n";
    else
      cout << trie.prefix(s) << "\n";
  }
  return 0;
}