Cod sursa(job #2633598)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 7 iulie 2020 21:14:39
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

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

struct Trie {
  int cnt, children;
  Trie * Children[26];
  Trie () {
    cnt = children = 0;
    memset (Children, NULL, sizeof (Children));
  }
};

Trie * Insert (Trie * node, char * s) {
  if (node == NULL)
    node = new Trie;
  node -> children ++;
  if (*s == '\0')
    node -> cnt ++;
  else
    node -> Children[*s - 'a'] = Insert (node -> Children[*s - 'a'], s + 1);
  return node;
}

Trie * Delete (Trie * node, char * s) {
  node -> children --;
  if (*s == '\0')
    node -> cnt --;
  else
    node -> Children[*s - 'a'] = Delete (node -> Children[s[0]- 'a'], s + 1);
  if (node -> children == 0)
    node = NULL;
  return node;
}

int Count (Trie * node, char * s) {
  if (node == NULL)
    return -1;
  if (*s == '\0')
    return node -> cnt;
  return Count (node -> Children[*s - 'a'], s + 1);
}

int Preffix (Trie * node, char * s) {
  if (node == NULL)
    return -1;
  if (*s == '\0')
    return 0;
  return 1 + Preffix (node -> Children[*s - 'a'], s + 1);
}

int main () {
  Trie * T = new Trie;
  short op;
  char s[24];
  while (fin >> op) {
    fin >> s;
    if (op == 0)
      T = Insert (T, s);
    if (op == 1)
      T = Delete (T, s);
    if (op == 2)
      fout << Count (T, s) << '\n';
    if (op == 3)
      fout << Preffix (T, s) << '\n';
  }
  return 0;
}