Cod sursa(job #2902216)

Utilizator Teodor94Teodor Plop Teodor94 Data 15 mai 2022 21:31:37
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <bits/stdc++.h>
using namespace std;

struct Node {
  unordered_map<char, Node*> edges;

  int noWords;
  int noFinalWords;

  inline Node* getEdge(char c) {
    auto edgeIt = edges.find(c);
    return edgeIt != edges.end() ? edgeIt->second : NULL;
  }

  inline Node* addEdge(char c) {
    Node* edge = getEdge(c);
    if (!edge)
      edges[c] = edge = new Node();

    ++edge->noWords;

    return edge;
  }

  inline Node* removeEdge(char c) {
    --edges[c]->noWords;
    return edges[c];
  }
};

Node root;

void addWord(const char* word) {
  int i;
  Node* current;

  i = 0;
  current = &root;
  while (word[i])
    current = current->addEdge(word[i++]);

  ++root.noWords;
  ++current->noFinalWords;
}

void removeWord(const char* word) {
  int i;
  Node* current;

  i = 0;
  current = &root;
  while (word[i] && current && current->noWords)
    current = current->getEdge(word[i++]);

  if (current && current->noFinalWords) {
    i = 0;
    current = &root;
    while (word[i])
      current = current->removeEdge(word[i++]);

    --root.noWords;
    --current->noFinalWords;
  }
}

int countWord(const char* word) {
  int i;
  Node* current;

  i = 0;
  current = &root;
  while (word[i] && current && current->noWords)
    current = current->getEdge(word[i++]);

  return current ? current->noFinalWords : 0;
}

int prefixLength(const char* word) {
  int i;
  Node* current;

  i = 0;
  current = &root;
  while (word[i] && current && current->noWords)
    current = current->getEdge(word[i++]);

  return current && current->noWords ? i : i - 1;
}

#define WORD_LENGTH 20
char word[WORD_LENGTH + 1];

int main() {
  FILE *fin, *fout;
  fin = fopen("trie.in", "r");
  fout = fopen("trie.out", "w");

  int op;
  while (fscanf(fin, "%d %s\n", &op, word) == 2) {
    if (op == 0)
      addWord(word);
    else if (op == 1)
      removeWord(word);
    else if (op == 2)
      fprintf(fout, "%d\n", countWord(word));
    else
      fprintf(fout, "%d\n", prefixLength(word));
  }

  fclose(fin);
  fclose(fout);
  return 0;
}