前言:
AC自动机与KMP算法,都是用于优化字符串匹配的算法。
KMP算法应用于单模式串的匹配。
而AC自动机是应用于多模式串的匹配。
但并不意味着KMP算法可以被完全取代(尽管两者的算法思想本质上是一样的)。
KMP算法:
相对而言,KMP算法比较容易一些。
首先,考虑如何暴力匹配?很显然,可以以主串的任意一个位置开头,然后开始匹配,失配后,再找下一个位置开头。
这样的复杂度显然是O(n*m)的。非常低劣。
而KMP算法则是用于优化这个过程的。显然,每次重新匹配时,如果能利用之前匹配的信息,那么就会节约很多时间。这里就要引入fail数组。 f a i l i fail_i faili表示与前缀 i i i拥有相同后缀的,最靠后的位置。这样如果在i号位置失配,那么可以跳到其fail指针的位置,继续匹配。
这样做的复杂度很显然就是O(n+m)的。
板子:
void build(int x){
int i=0,j=-1;
fail[0]=-1;
while(i<len[x]){
if(j==-1||s1[x][i]==s1[x][j]){
i++;
j