Advertisement
AlexG2230954

Олимп прога : бор

Mar 17th, 2022
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. struct trie {
  8.     // узел в боре (курсор)
  9.     struct node {
  10.         map<char, int> go; // соотношение переходов "символ" - "индекс нового узла"
  11.         int end = 0; // терминирующая ли вершина
  12.         int dp = 0; // счетчик слов, которые можно найти через эту вершину
  13.     };
  14.  
  15.     vector<node> data; // массив узлов
  16.  
  17.     // создает новый узел и возвращает его индекс
  18.     int create_node() {
  19.         data.push_back(node());
  20.         return data.size() - 1;
  21.     }
  22.  
  23.     // можно ли из текущей вершины перейти к следующему символу?
  24.     bool can_go(int u, char c) {
  25.         return data[u].go.count(c);
  26.     }
  27.  
  28.     // переход к следующей вершине. Возвращает индекс новой вершины
  29.     int go(int u, int c) {
  30.         return data[u].go[c];
  31.     }
  32.  
  33.     // вставка строки в бор
  34.     int insert(const string & s) {
  35.         int u = 0; // индекс текущего узла
  36.  
  37.         for(char c : s) {
  38.             data[u].dp++; // добавляем слово к счетчику
  39.  
  40.             if(!can_go(u, c))
  41.                 data[u].go[c] = create_node();
  42.  
  43.             u = go(u, c);
  44.         }
  45.  
  46.         data[u].dp++; // добавляем к последней вершине слово
  47.         data[u].end++; // указываем, что эта вершина - конец строки
  48.     }
  49.  
  50.     // находится ли строка s в боре
  51.     bool find(const string & s) {
  52.         int u = 0;
  53.  
  54.         for(char c : s) {
  55.             if(!can_go(u, c)) return false;
  56.             u = go(u, c);
  57.         }
  58.  
  59.         return data[u].end;
  60.     }
  61.  
  62.  
  63.     void erase(const string & s) {
  64.         int u = 0;
  65.  
  66.         for(char c : s) {
  67.             data[u].dp--;
  68.             u = go(u, c);
  69.         }
  70.  
  71.         data[u].dp--;
  72.         data[u].end--;
  73.     }
  74.        
  75.  
  76.     trie() {
  77.         create_node();
  78.     }
  79. };
  80.  
  81.  
  82. int main() {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement