Cod sursa(job #2779691)

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

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

class TRIE {
private:
  int alpha;
  class Node {
  public:
    std::vector<Node*> child;
    int cnt, end;
    Node(int alpha) {
      child.resize(alpha);
      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 = new Node(alpha);
      temp = root -> child[s[0] - 'a'];
      delete temp;
      root -> child[s[0] - 'a'] = nullptr;
    }
  }
  Node *root;
public:
  TRIE(int _alpha) {
    alpha = _alpha;
    root = new Node(alpha);
  }
  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(alpha);
      }
      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 = 100;

int op;

char s[maxN + 5];

int main() {
  TRIE ds(26);
  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;
}