Cod sursa(job #2285505)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 18 noiembrie 2018 17:41:37
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.46 kb
#include <stdio.h>
#include <vector>
#include <string>

using namespace std;

const int ASIZE = 26;

class TrieNode {
public:
   TrieNode() {
      app = 0;
      ccnt = 0;
      for (int i = 0; i < ASIZE; ++i) {
         next[i] = nullptr;
      }
   }
   TrieNode* next[ASIZE];
   int app;
   int ccnt;
};

class Trie {
public:
   Trie() {
      root = new TrieNode();
   }

   void add_word(char* w) {
      TrieNode *node = root;

      while (*w) {
         int ix = int(*w - 'a');
         if (node->next[ix] == nullptr) {
            TrieNode* new_node = new TrieNode();
            node->next[ix] = new_node;
            node->ccnt++;

            node = new_node;
         } else {
            node = node->next[ix];
         }
         w++;
      }

      node->app += 1;
   }

   int delete_(char* w, TrieNode* node) {
      if (*w == 0) {
         node->app--;
      } else {
         int ix = int(w[0] - 'a');
         if (node->next[ix] != nullptr) {
            if (delete_(w+1, node->next[ix])) {
               node->ccnt--;
               node->next[ix] = nullptr;
            }
         }
      }

      if (node->app == 0 && node->ccnt == 0) {
         delete node;
         return 1;
      }

      return 0;
   }

   void delete_word(char* w) {
      delete_(w, root);
   }

   int get_word(char* w) {
      TrieNode *node = root;

      while (*w) {
         int ix = int(*w - 'a');
         if (node->next[ix] == nullptr) {
            return 0;
         } else {
            node = node->next[ix];
         }
         w++;
      }

      return node->app;
   }

   int get_longest(char* w) {
      TrieNode *node = root;

      int longest_pref = 0;
      while (*w) {
         int ix = int(*w - 'a');
         if (node->next[ix] == nullptr) {
            return longest_pref;
         } else {
            longest_pref += 1;
            node = node->next[ix];
         }

         w++;
      }

      return longest_pref;
   }


   TrieNode* root = nullptr;
};


int main() {
   freopen("trie.in", "r", stdin);
   freopen("trie.out", "w", stdout);

   Trie t;
   int type;
   char word[20];

   while (scanf("%d %s", &type, word) != EOF) {
      switch (type) {
         case 0:
            t.add_word(word);
            break;
         case 1:
            t.delete_word(word);
            break;
         case 2:
            printf("%d\n", t.get_word(word));
            break;
         case 3:
            printf("%d\n", t.get_longest(word));
            break;
      }
   }

   return 0;
}