Cod sursa(job #3150668)

Utilizator victorzarzuZarzu Victor victorzarzu Data 17 septembrie 2023 21:43:08
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <unordered_map>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct Trie {
  int number, chld_nr;
  unordered_map<char, Trie*> children;

  Trie() {
    number = chld_nr = 0;
  }
};

Trie* T = new Trie;

void add(Trie* node, char* word) {
  if(!isalpha(*word)) {
    node->number++;
    return;
  }

  if(!node->children.contains(*word)) {
    node->chld_nr++;
    node->children[*word] = new Trie;
  }

  add(node->children[*word], word + 1);
}

bool del(Trie* node, char* word) {
  if(!isalpha(*word)) {
    node->number--;
  } else if(del(node->children[*word], word + 1)) {
    node->chld_nr--;
    node->children.erase(*word);
  }

  if(!node->chld_nr && !node->number && node != T) {
    delete node;
    return true;
  }

  return false;
}


int occurances(Trie* node, char *word) {
  if(!isalpha(*word)) {
    return node->number;
  }
  if(!node->children.contains(*word)) {
    return 0;
  }

  return occurances(node->children[*word], word + 1);
}

int prefix(Trie* node, char *word, int len) {
  if(!isalpha(*word) || !node->children.contains(*word)) {
    return len;
  }
  return prefix(node->children[*word], word + 1, len + 1);
}

void solve() {
  int x;
  char word[21];
  while(f>>x>>word) {
    if(x == 0) {
      add(T, word);
    } else if(x == 1) {
      del(T, word);
    } else if(x == 2) {
      g<<occurances(T, word) << '\n';
    } else {
      g<<prefix(T, word, 0) << '\n';
    }
  }
}

int main() {
  solve();
  return 0;
}