Cod sursa(job #2729701)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 25 martie 2021 09:44:15
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
/// functiile implementate iterativ

#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) {
  for(int i = 0; i <= l; i++) {
    if(i > 0)
      crt->nr_ap++;
    if(i == l)
      crt->capat++;
    else {
      if(!crt->fii[cuv[i] - 'a'])
        crt->fii[cuv[i] - 'a'] = new nod;
      crt = crt->fii[cuv[i] - 'a'];
    }
  }
}

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

  nod *urm;
  crt = ccrt;
  for(int i = 0; i <= l; i++) {
    if(i < l) {
      urm = crt->fii[cuv[i] - 'a'];
      if(crt->fii[cuv[i] - 'a']->nr_ap == 0)
        crt->fii[cuv[i] - 'a'] = nullptr;
    }
    if(i > 0 && crt->nr_ap == 0)
      delete crt;
    if(i < l)
      crt = urm;
  }
}

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

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

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)));
  }

  return 0;
}