Advertisement
Adam_mz_

Untitled

Dec 14th, 2021
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1. #include "iostream"
  2. #include <utility>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. class Trie
  8. {
  9. private:
  10.     class Node
  11.     {
  12.     public:
  13.         bool endOfTheWord = 0;
  14.         char ch{};
  15.         vector<Node *> deti;
  16.  
  17.         explicit Node(char k) : ch(k)
  18.         {}
  19.  
  20.         Node()
  21.         {}
  22.  
  23.  
  24.         Node *search(char c)
  25.         {
  26.             for (Node *current : deti)
  27.             {
  28.                 if (current->ch == c)
  29.                     return current;
  30.             }
  31.             return nullptr;
  32.         }
  33.  
  34.         Node *insertCharacter(char c)
  35.         {
  36.             Node *find_result = search(c);
  37.             if (find_result)
  38.                 return find_result;
  39.  
  40.             Node *new_node = new Node(c);
  41.             deti.push_back(new_node);
  42.             return new_node;
  43.         }
  44.  
  45.         ~Node()
  46.         {
  47.             for (int i = 0; i < deti.size(); ++i)
  48.             {
  49.                 delete deti[i];
  50.             }
  51.  
  52.         }
  53.     };
  54.  
  55.  
  56. public:
  57.     Node *_root;
  58.  
  59.     Trie() : _root(new Node())
  60.     {}
  61.  
  62.     void retrieveFunc(Node *currNode, const string &currPref)
  63.     {
  64.         if (currNode->endOfTheWord)
  65.             cout << currPref << std::endl;
  66.  
  67.         for (Node *child : currNode->deti)
  68.             retrieveFunc(child, currPref + child->ch);
  69.     }
  70.  
  71.     Node *eraseFunc(string k, Node *currNode, int depth)
  72.     {
  73.         if (!currNode)
  74.             return nullptr;
  75.  
  76.         if (depth == k.length())
  77.         {
  78.             currNode->endOfTheWord = false;
  79.             if (currNode->deti.empty())
  80.             {
  81.                 Node *tmp = currNode;
  82.                 delete currNode;
  83.                 return tmp;
  84.             } else
  85.             {
  86.  
  87.             }
  88.         } else
  89.         {
  90.  
  91.         }
  92.  
  93.         Node *detyo = eraseFunc(k, currNode->search(k[depth]), depth + 1);
  94.  
  95.         if (!currNode->endOfTheWord)
  96.             if (currNode->deti.empty())
  97.                 currNode = nullptr;
  98.  
  99.         return currNode;
  100.     }
  101.  
  102.  
  103.     bool keyInTrie(const string &key) const
  104.     {
  105.         Node *x = _root;
  106.  
  107.         for (char i : key)
  108.         {
  109.             x = x->search(i);
  110.  
  111.             if (!x)
  112.                 return false;
  113.         }
  114.  
  115.         return x->endOfTheWord;
  116.     }
  117.  
  118.     Node *insertKey(const string &k) const
  119.     {
  120.         Node *x = _root;
  121.  
  122.         for (char i : k)
  123.             x = x->insertCharacter(i);
  124.         x->endOfTheWord = true;
  125.         return x;
  126.     }
  127.  
  128.     void getAllWordsByPrefix(const string &pref)
  129.     {
  130.         Node *last = _root;
  131.  
  132.         for (char i : pref)
  133.         {
  134.             last = last->search(i);
  135.             if (!last)
  136.                 return;
  137.         }
  138.  
  139.         retrieveFunc(last, pref);
  140.     }
  141.  
  142.     void eraser(string key)
  143.     {
  144.         _root = eraseFunc(std::move(key), _root, 0);
  145.     }
  146. };
  147.  
  148. signed main()
  149. {
  150.     string input, prefix, word;
  151.     cin >> input >> prefix;
  152.  
  153.     Trie trie = Trie();
  154.  
  155.     for (char c : input)
  156.     {
  157.         if (c == '$')
  158.         {
  159.             trie.insertKey(word);
  160.         } else if (c == '#')
  161.         {
  162.             word.pop_back();
  163.         } else
  164.         {
  165.             word.push_back(c);
  166.         }
  167.     }
  168.  
  169.     trie.getAllWordsByPrefix(prefix);
  170.  
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement