competitive/data_structure/
trie.rs1use super::Monoid;
2use std::collections::VecDeque;
3
4#[derive(Debug, Clone)]
5pub struct Trie {
6 child: Vec<usize>,
7 node_size: usize,
8 char_size: usize,
9}
10impl Trie {
11 pub fn new(char_size: usize) -> Self {
12 Self {
13 child: vec![!0; char_size],
14 node_size: 1,
15 char_size,
16 }
17 }
18 pub fn with_capacity(char_size: usize, capacity: usize) -> Self {
19 let mut child = Vec::with_capacity(capacity * char_size);
20 child.resize(char_size, !0);
21 Self {
22 child,
23 node_size: 1,
24 char_size,
25 }
26 }
27 pub fn insert_once_at(&mut self, node: usize, ch: usize) -> usize {
28 let index = node * self.char_size + ch;
29 if self.child[index] == !0 {
30 self.child[index] = self.node_size;
31 self.child.resize(self.child.len() + self.char_size, !0);
32 self.node_size += 1;
33 }
34 self.child[index]
35 }
36 pub fn insert_at<I>(&mut self, mut node: usize, iter: I) -> Vec<usize>
37 where
38 I: IntoIterator<Item = usize>,
39 {
40 let mut path = Vec::new();
41 for ch in iter.into_iter() {
42 path.push(node);
43 node = self.insert_once_at(node, ch);
44 }
45 path.push(node);
46 path
47 }
48 pub fn insert<I>(&mut self, iter: I) -> Vec<usize>
49 where
50 I: IntoIterator<Item = usize>,
51 {
52 self.insert_at(0, iter)
53 }
54 pub fn find_at<I>(&self, mut node: usize, iter: I) -> Result<usize, usize>
55 where
56 I: IntoIterator<Item = usize>,
57 {
58 for ch in iter.into_iter() {
59 if let Some(&nnode) = self.child.get(node * self.char_size + ch) {
60 node = nnode;
61 } else {
62 return Err(node);
63 }
64 }
65 Ok(node)
66 }
67 pub fn find<I>(&self, iter: I) -> Result<usize, usize>
68 where
69 I: IntoIterator<Item = usize>,
70 {
71 self.find_at(0, iter)
72 }
73 pub fn next_node(&self, node: usize, ch: usize) -> Option<usize> {
74 let index = node * self.char_size + ch;
75 if self.child[index] == !0 {
76 None
77 } else {
78 Some(self.child[index])
79 }
80 }
81 pub fn node_size(&self) -> usize {
82 self.node_size
83 }
84 pub fn edges(&self) -> Vec<(usize, usize)> {
85 let mut edges = Vec::with_capacity(self.node_size - 1);
86 let mut stack = vec![0usize];
87 while let Some(node) = stack.pop() {
88 for ch in (0..self.char_size).rev() {
89 if let Some(nnode) = self.next_node(node, ch) {
90 edges.push((node, nnode));
91 stack.push(nnode);
92 }
93 }
94 }
95 edges
96 }
97 pub fn build_failure<M>(&mut self, dp: &mut [M::T])
98 where
99 M: Monoid,
100 {
101 let mut fail = vec![0usize; self.node_size];
102 let mut deq = VecDeque::new();
103 for ch in 0..self.char_size {
104 if self.child[ch] != !0 {
105 deq.push_back(self.child[ch]);
106 } else {
107 self.child[ch] = 0;
108 }
109 }
110 while let Some(node) = deq.pop_front() {
111 let f = fail[node];
112 dp[node] = M::operate(&dp[node], &dp[f]);
113 let base = node * self.char_size;
114 let fbase = f * self.char_size;
115 for ch in 0..self.char_size {
116 let index = base + ch;
117 let nnode = self.child[index];
118 if nnode != !0 {
119 deq.push_back(nnode);
120 fail[nnode] = self.child[fbase + ch];
121 } else {
122 self.child[index] = self.child[fbase + ch];
123 }
124 }
125 }
126 }
127}