Cod sursa(job #2779698)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 4 octombrie 2021 19:07:02
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

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

class TRIE {
private:
  const static int ALPHA = 26;
  class Node {
  public:
    Node *child[ALPHA];
    int cnt, end;
    Node() {
      for (int i = 0; i < ALPHA; i++) {
        child[i] = nullptr;
      }
      cnt = end = 0;
    }
  };
  void del(Node *root, char *s) {
    root -> cnt--;
    if (s[0] == '\0') {
      root -> end--;
      return;
    }
    del(root -> child[s[0] - 'a'],  s + 1);
    if (root -> child[s[0] - 'a'] -> cnt == 0) {
      Node *temp = root -> child[s[0] - 'a'];
      delete temp;
      root -> child[s[0] - 'a'] = nullptr;
    }
  }
  Node *root;
public:
  TRIE() {
    root = new Node();
  }
  void add(char *s) {
    Node *iter = root;
    int n = (int)strlen(s);
    for (int i = 0; i < n; i++) {
      if (iter -> child[s[i] - 'a'] == nullptr) {
        iter -> child[s[i] - 'a'] = new Node();
      }
      iter = iter -> child[s[i] - 'a'];
      iter -> cnt++;
    }
    iter -> end++;
  }
  int count(char *s) {
    Node *iter = root;
    int n = (int)strlen(s);
    for (int i = 0; i < n; i++) {
      if (iter -> child[s[i] - 'a'] == nullptr) {
        return 0;
      }
      iter = iter -> child[s[i] - 'a'];
    }
    return iter -> end;
  }
  int prefix(char *s) {
    Node *iter = root;
    int n = (int)strlen(s);
    for (int i = 0; i < n; i++) {
      if (iter -> child[s[i] - 'a'] == nullptr) {
        return i;
      }
      iter = iter -> child[s[i] - 'a'];
    }
    return n;
  }
  void del(char *s) {
    del(root, s);
  }
};

const int maxN = 26;

int op;

char s[maxN + 5];

int main() {
  TRIE ds;
  while (in >> op >> s) {
    if (op == 0) {
      ds.add(s);
    } else if (op == 1) {
      ds.del(s);
    } else if (op == 2) {
      out << ds.count(s) << "\n";
    } else {
      out << ds.prefix(s) << "\n";
    }
  }
  return 0;
}