16 个版本 (1 个稳定版本)
1.0.0 | 2024年3月27日 |
---|---|
0.7.0 | 2024年2月29日 |
0.6.1 | 2023年11月27日 |
0.5.4 | 2023年11月24日 |
0.1.1 | 2023年10月13日 |
#251 in 算法
每月264次下载
用于 mtc-token-healing
94KB
2.5K SLoC
general-sam
Rust 语言中的通用后缀自动机实现。
还提供 Python 绑定和一些实用工具。请查看 general-sam-py
。
flowchart LR
init((ε))
a((a))
b((b))
ab((ab))
bc(((bc)))
abc((abc))
abcb((abcb))
abcbc(((abcbc)))
init -- a --> a
init -- b --> b
a -- b --> ab
b -- c --> bc
init -- c --> bc
ab -- c --> abc
bc -- b --> abcb
abc -- b --> abcb
abcb -- c --> abcbc
字符串 "abcbc" 的后缀自动机。
示例
use general_sam::{GeneralSam, BTreeTransTable};
let sam = GeneralSam::<BTreeTransTable<_>>::from_bytes("abcbc");
// "cbc" is a suffix of "abcbc"
assert!(sam.get_root_state().feed_bytes("cbc").is_accepting());
// "bcb" is not a suffix of "abcbc"
assert!(!sam.get_root_state().feed_bytes("bcb").is_accepting());
use general_sam::{GeneralSam, BTreeTransTable};
let sam = GeneralSam::<BTreeTransTable<_>>::from_chars("abcbc");
let mut state = sam.get_root_state();
// "b" is not a suffix but at least a substring of "abcbc"
state.feed_chars("b");
assert!(!state.is_accepting());
// "bc" is a suffix of "abcbc"
state.feed_chars("c");
assert!(state.is_accepting());
// "bcbc" is a suffix of "abcbc"
state.feed_chars("bc");
assert!(state.is_accepting());
// "bcbcbc" is not a substring, much less a suffix of "abcbc"
state.feed_chars("bc");
assert!(!state.is_accepting() && state.is_nil());
# #[cfg(feature = "trie")] {
use general_sam::{GeneralSam, Trie, BTreeTransTable};
let mut trie = Trie::<BTreeTransTable<_>>::default();
trie.insert("hello".chars());
trie.insert("Chielo".chars());
let sam = GeneralSam::<BTreeTransTable<_>>::from_trie(trie.get_root_state());
assert!(sam.get_root_state().feed_chars("lo").is_accepting());
assert!(sam.get_root_state().feed_chars("ello").is_accepting());
assert!(sam.get_root_state().feed_chars("elo").is_accepting());
assert!(!sam.get_root_state().feed_chars("el").is_accepting());
assert!(!sam.get_root_state().feed_chars("el").is_nil());
assert!(!sam.get_root_state().feed_chars("bye").is_accepting());
assert!(sam.get_root_state().feed_chars("bye").is_nil());
# }
参考文献
- Mehryar Mohri, Pedro Moreno, Eugene Weinstein. 广义后缀自动机构造算法及空间界限。
- 刘研绎《后缀自动机在字典树上的拓展》
- 广义后缀自动机 - OI Wiki
许可证
- © 2023 Chielo Newctle <[email protected]>
- © 2023 ModelTC 团队
此项目许可协议为以下之一:
任选其一。
此项目的 SPDX 许可协议标识符为 MIT OR Apache-2.0
。
依赖项
~74KB