Cod sursa(job #2729564)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 24 martie 2021 21:33:19
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int LMAX = 20;
const int SIGMA = 26;

struct nod {
  int nr_ap, capat;
  nod *fii[SIGMA];

  nod() : nr_ap(0), capat(0) {
    for(int i = 0; i < SIGMA; i++)
      fii[i] = nullptr;
  }
};

void add_cuv(nod *crt, char *cuv, int l) {
  crt->nr_ap++;
  if(l == 0)
    crt->capat++;
  else {
    if(!crt->fii[cuv[0] - 'a'])
      crt->fii[cuv[0] - 'a'] = new nod;
    add_cuv(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
  }
}

void del_cuv(nod *crt, char *cuv, int l) {
  crt->nr_ap--;
  if(l == 0)
    crt->capat--;
  else {
    del_cuv(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
    if(crt->fii[cuv[0] - 'a']->nr_ap == 0) {
      delete crt->fii[cuv[0] - 'a'];
      crt->fii[cuv[0] - 'a'] = nullptr;
    }
  }
}

int get_nr_ap(nod *crt, char *cuv, int l) {
  if(l == 0)
    return crt->capat;
  if(!crt->fii[cuv[0] - 'a'])
    return 0;
  return get_nr_ap(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
}

int get_longest_prefix(nod *crt, char *cuv, int l) {
  if(l == 0 || !crt->fii[cuv[0] - 'a'])
    return 1;
  return 1 + get_longest_prefix(crt->fii[cuv[0] - 'a'], cuv + 1, l - 1);
}

int main() {
  freopen("trie.in", "r", stdin);
  freopen("trie.out", "w", stdout);
  int op;
  char cuv[LMAX + 1];
  nod *trie_root = new nod;

  while(scanf("%d %s ", &op, cuv) != EOF) {
    if(op == 0)
      add_cuv(trie_root, cuv, strlen(cuv));
    else if(op == 1)
      del_cuv(trie_root, cuv, strlen(cuv));
    else if(op == 2)
      printf("%d\n", get_nr_ap(trie_root, cuv, strlen(cuv)));
    else
      printf("%d\n", get_longest_prefix(trie_root, cuv, strlen(cuv)) - 1);
  }

  return 0;
}