写了一遍多字符串匹配的ac-search算法,输出所有的原串匹配区间。
build_trie()构造一个trie,build_longest_trans_target()函数构造自动机无法前向匹配时的转移路径,即TrieNode::prefix字段。当自动机到达一个最终状态后(terminal state,TrieNode::pattern_end)构造原串当前位置之前的所有匹配区间,通过把patterns串reverse之后构造出一个prefix树然后遍历实现。如果有更好的匹配串构造方法请留言。
原理请参考: <Flexible Pattern Matching in Strings>, 3.2.2 Basic Aho-Corasick Algorithm.
Trie & reverse(patterns)之后的trie树和状态机构造代码
1 | struct TrieNode { |
ac-search & test
1 | void fill_pattern_occurrence(TrieNode* suffix, const string& haystack, int pos, |
完整代码:github