摘要:
即在trie上kmp。AC自动机是一种多模式串匹配算法,用于在一个文本串中查找多个模式串。 注意到,AC自动机的\(fail\)也构成了一个树形结构。我们只需要在操作完进行一个离线拓扑排序就不用每次匹配到一个点,暴力跑完所有fail确认是哪些模式串。 struct AC { vector<int>e 阅读全文
摘要:
Z函数可以在\(O(n)\)时间内求出自己的所有后缀和本身的LCP(最长公共前缀),和任意字符串\(T\)和其的LCP。 原理就是考虑之前的lcp,可以通过之前的lcp这一位和前缀某一位一致,对应到前缀某一位的LCP,再向右扩展。注意到,右边界最多被扩展1次所以是线性复杂度。 struct Z { 阅读全文
摘要:
Shift And 一种暴力字符串匹配算法,用bitset优化。复杂度\(O(N*M/w)\) 用\(p\)记录当前匹配第几位是成立的,\(skip\)记录字符是\(c\)的有哪些位置。匹配时,\(p\)中第\(k\)位置是成立的,且下一位正好是\(skip\)对应的字符。那么下一位成立。 bits 阅读全文
摘要:
kmp 经典字符串匹配算法。其实是通过找本身前缀\(i\)的最长border,来实现快速匹配的。 这里给出border的定义:字符串\(s\) 的一个子串既是它的前缀又是它的后缀,则这个子串是它的border(一般不包含本身) kmp通过fail在border上跳,使得每次前面部分的字符串都是相同的 阅读全文
摘要:
由于笔者不常使用字典树,且整理不够全面,本文只做启发。 trie 字典树,把多个元素的前缀合并起来,用来完成单个元素和集合的匹配。 构造: void insert(trar *str) { int p = 0, len = strlen(str + 1); for (int i = 1; i <= 阅读全文
摘要:
由于笔者不常使用哈希,且整理不够全面,本文只做启发。 哈希 寻找一个映射函数\(f\)把一个集合映射到一个有限集合,使得不同元素映射的值不同,相同元素的值相同。 我们希望这个函数能让我们快速判断两个字符串是否相同。 构造 字符串的哈希一般构造如下: template<unsigned bas = 1 阅读全文
摘要:
题目 题意 给定一个字符串 \(s\) ,每次询问\(s[l,n]\),任意分成\(k\)段。问每一段的最大字典序最小是什么。 题解 初学Lyndon,根据 $ w_1 \geq w_2 \geq \cdots \geq w_k $。第一想法就是找到那个 $ w_i $然后后面的都比它大。 但是询问 阅读全文