Trie-Code
#include <cstring>
#include <string>
#include <vector>
class Trie {
static constexpr size_t M = 26;
static constexpr char OFFSET = 'a';
struct TrieNode {
int child[M];
bool is_terminal;
TrieNode() {
std::memset(child, -1, sizeof(int) * M);
is_terminal = false;
}
};
std::vector<TrieNode> nodes;
public:
Trie() : nodes(1) {}
void init() {
nodes.resize(1);
nodes[0] = TrieNode();
}
void insert(const std::string& str) {
int node_id = 0;
for (const auto& c : str) {
if (nodes[node_id].child[c - OFFSET] == -1) {
nodes[node_id].child[c - OFFSET] = nodes.size();
nodes.emplace_back();
}
node_id = nodes[node_id].child[c - OFFSET];
}
nodes[node_id].is_terminal = true;
}
void remove(const std::string& str) {
int node_id = 0;
for (const auto& c : str) {
if (nodes[node_id].child[c - OFFSET] == -1) {
return;
}
node_id = nodes[node_id].child[c - OFFSET];
}
nodes[node_id].is_terminal = false;
}
bool find(const std::string& str) const {
int node_id = 0;
for (const auto& c : str) {
if (nodes[node_id].child[c - OFFSET] == -1) {
return false;
}
node_id = nodes[node_id].child[c - OFFSET];
}
return nodes[node_id].is_terminal;
}
};
Written on August 5, 2022
