Cod sursa(job #2788433)

Utilizator YusyBossFares Yusuf YusyBoss Data 25 octombrie 2021 17:54:48
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <map>
#include <vector>

using namespace std;

ifstream cin ("trie.in");
ofstream cout ("trie.out");

struct strnode {
  int finish_word, finish_prefix;
};

int nnode;
map <char, int> mpnext[2000001];
strnode vnode[2000001];

void add_word(string cuvant) {
  int i, n, node;

  node = i = 0;
  n = cuvant.size();
  for (i = 0; i < n; i++) {
    if (mpnext[node][cuvant[i]] > 0)
      node = mpnext[node][cuvant[i]];
    else {
      nnode++;
      mpnext[node][cuvant[i]] = nnode;
      node = nnode;
    }
    vnode[node].finish_prefix++;
  }

  vnode[node].finish_word++;
}

void delete_word(string cuvant) {
  int i, n, node;

  node = i = 0;
  n = cuvant.size();
  for (i = 0; i < n; i++) {
    node = mpnext[node][cuvant[i]];
    vnode[node].finish_prefix--;
  }

  vnode[node].finish_word--;
}

int query_ncuv(string cuvant) {
  int i, n, node;

  node = 0;
  n = cuvant.size();
  for (i = 0; i < n; i++) {
    if (mpnext[node][cuvant[i]] > 0 && vnode[mpnext[node][cuvant[i]]].finish_prefix > 0)
      node = mpnext[node][cuvant[i]];
    else
      return 0;
  }

  return vnode[node].finish_word;
}

int query_prefix(string pref) {
  int i, node;

  i = node = 0;
  while (i < pref.size() && mpnext[node][pref[i]] > 0 && vnode[mpnext[node][pref[i]]].finish_prefix > 0) {
    node = mpnext[node][pref[i]];
    i++;
  }

  return i;
}

int main() {
  int op;
  string s;

  while (cin >> op >> s) {
    if (op == 0)
      add_word(s);
    else if (op == 1)
      delete_word(s);
    else if (op == 2)
      cout << query_ncuv(s) << "\n";
    else
      cout << query_prefix(s) << "\n";
    s = "";
  }
  return 0;
}