2025-03-24 05:20:15 +01:00
|
|
|
use fxhash::FxBuildHasher;
|
2025-03-24 04:58:34 +01:00
|
|
|
use std::collections::HashMap;
|
|
|
|
|
|
2025-03-24 05:20:15 +01:00
|
|
|
type FxHashMap<K, V> = HashMap<K, V, FxBuildHasher>; //simpler, slightly faster
|
|
|
|
|
|
2025-03-24 04:58:34 +01:00
|
|
|
#[derive(Default, Debug, Clone)]
|
|
|
|
|
struct Node {
|
|
|
|
|
end: bool,
|
2025-03-24 05:20:15 +01:00
|
|
|
children: FxHashMap<char, Node>,
|
2025-03-24 04:58:34 +01:00
|
|
|
}
|
|
|
|
|
#[derive(Default, Debug, Clone)]
|
|
|
|
|
pub struct Trie {
|
|
|
|
|
root: Node,
|
|
|
|
|
}
|
|
|
|
|
impl Trie {
|
|
|
|
|
pub fn insert(&mut self, word: &str) {
|
|
|
|
|
let mut node = &mut self.root;
|
|
|
|
|
for char in word.chars() {
|
|
|
|
|
node = node.children.entry(char).or_default();
|
|
|
|
|
}
|
|
|
|
|
node.end = true;
|
|
|
|
|
}
|
|
|
|
|
pub fn contains(&self, word: &str) -> bool {
|
|
|
|
|
let mut current_node = &self.root;
|
|
|
|
|
for char in word.chars() {
|
|
|
|
|
match current_node.children.get(&char) {
|
|
|
|
|
Some(node) => current_node = node,
|
|
|
|
|
None => return false,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
current_node.end
|
|
|
|
|
}
|
|
|
|
|
}
|