Cod sursa(job #2866316)

Utilizator cadmium_Voicu Mihai-Valeriu cadmium_ Data 9 martie 2022 16:47:11
Problema Trie Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;
namespace Trie {
  struct Trie {
    int cnt, ends;
    Trie* v[26];
    Trie() {
      cnt = 0;
      ends = 0;
      memset(v, 0, sizeof(v));
    }
  };
  using ts = Trie*;
  ts root = new Trie;

  void insert(ts node, char *s) {
    if(s[0] == '\n') {
      node -> cnt++;
      return;
    }
    if(node -> v[s[0]] == 0)
      node -> ends++, node -> v[s[0]] = new Trie;
    insert(node -> v[s[0]], s + 1);
  }
  bool erase(ts node, char *s) {
    if(s[0] == '\n') {
      node -> cnt--;
    }
    else if(erase(node -> v[s[0]], s + 1)) {
      node -> ends--;
      node -> v[s[0]] = 0;
    }
    if(node -> cnt == 0 && node -> ends == 0 && node != root) {
      delete node;
      return 1;
    }
    return 0;
  }
  int query(ts node, char *s) {
    if(s[0] == '\n')
      return node -> cnt;
    if(node -> v[s[0]] != 0)
      return query(node -> v[s[0]], s + 1);
    return 0;
  }
  int maxx = 0;
  void lcp(ts node, char *s) {
    maxx++;
    if(s[0] == '\n')
      return;
    if(node -> v[s[0]])
      lcp(node -> v[s[0]], s + 1);
    return;
  }
};

#define cin fin
#define cout fout
ifstream cin("trie.in");
ofstream cout("trie.out");

char s[35];

int main() {
  int cer;
  char ch;
  while(cin >> cer) {
    cin.get();
    int ptr = 0;
    do {
      ch = cin.get();
      s[ptr++] = ch - 'a';
    } while(ch != '\n');
    s[ptr - 1] += 'a';
    if(cer == 0)
      Trie::insert(Trie::root, s);
    if(cer == 1)
      Trie::erase(Trie::root, s);
    if(cer == 2)
      cout << Trie::query(Trie::root, s) << '\n';
    if(cer == 3)
      Trie::maxx = -1, Trie::lcp(Trie::root, s), cout << Trie::maxx << '\n';
  }
}