字符串专题算是搞得差不多了,来大概总结一下吧。
要掌握的算法:
1、KMP算法
作用是两个串之间的匹配,核心思想是pre[i]表示串B的最长的前缀与以i为结尾的后缀相同,每次匹配失败时,从i跳到pre[i]就可以了。
2、trie树
作用是存储许多个串,核心思想是除根节点每个点表示一个字母,从根节点到每个点的路径表示一个字符串,单词节点打上标记
3、AC自动机
作用是多个串的匹配,KMP+trie树,核心思想是fail[i]表示长度最长的某个前缀是i节点所代表的字符串的一个后缀,通过fail[i]处理出ch[x][i]表示x节点加入一个i字符后转移到的节点。注意可以结合dp来考察。
4、manacher算法
作用是处理出以每个位置为中心的最长回文串长度,核心思想是记录一个最长的延伸到的地方,利用对称的思想处理出一个当前位置的起始值,之后暴力匹配,比较神奇,时间复杂度很好证明。
5、后缀数组
作用是对单个字符串后缀排序,求两个后缀的LCP,核心思想是sa数组和height数组的求法,详见论文,不再过多赘述。
6、后缀自动机
作用是对单串建立自动机,能够给接受该串的每个子串,核心思想是每个节点代表多个字符串,其中每个节点的right集合相同,记录一个fa[i]表示最小的right集合使i的right集合是它的子集,具体还是要看论文。应用更加广泛。
7、hash
作用是判断两个字符串是否相同,核心思想是……
各大OJ的字符串题目:
1、hdu2222 Keywords Search
建出AC自动机后,在AC自动机上暴力跑,每跑到一个节点就暴力去更新所有fail节点的答案就好了,暴力可过。
2、hdu2896 病毒侵袭
同上题,建出AC自动机后,暴力跑fail指针。
3、hdu3065病毒侵袭持续中
同上题,建出AC自动机后,暴力跑fail指针。
4、poj2778 DNA Sequence
建出AC自动机后dp,dp[i][j]表示长度为i匹配到j节点的方案数,转移非常简单,非常裸的矩阵优化。
</