Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <vector>
- using namespace std;
- struct trie {
- // узел в боре (курсор)
- struct node {
- map<char, int> go; // соотношение переходов "символ" - "индекс нового узла"
- int end = 0; // терминирующая ли вершина
- int dp = 0; // счетчик слов, которые можно найти через эту вершину
- };
- vector<node> data; // массив узлов
- // создает новый узел и возвращает его индекс
- int create_node() {
- data.push_back(node());
- return data.size() - 1;
- }
- // можно ли из текущей вершины перейти к следующему символу?
- bool can_go(int u, char c) {
- return data[u].go.count(c);
- }
- // переход к следующей вершине. Возвращает индекс новой вершины
- int go(int u, int c) {
- return data[u].go[c];
- }
- // вставка строки в бор
- int insert(const string & s) {
- int u = 0; // индекс текущего узла
- for(char c : s) {
- data[u].dp++; // добавляем слово к счетчику
- if(!can_go(u, c))
- data[u].go[c] = create_node();
- u = go(u, c);
- }
- data[u].dp++; // добавляем к последней вершине слово
- data[u].end++; // указываем, что эта вершина - конец строки
- }
- // находится ли строка s в боре
- bool find(const string & s) {
- int u = 0;
- for(char c : s) {
- if(!can_go(u, c)) return false;
- u = go(u, c);
- }
- return data[u].end;
- }
- void erase(const string & s) {
- int u = 0;
- for(char c : s) {
- data[u].dp--;
- u = go(u, c);
- }
- data[u].dp--;
- data[u].end--;
- }
- trie() {
- create_node();
- }
- };
- int main() {}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement