KMP算法通常用来判断一个字符串是否是另一个的字串
核心思想:在每次失配时,不是把字符串往后移一位,而是把p串往后移动至下一次可以和前面部分匹配的位置,这样就可以跳过大多数的失配步骤。而每次p串移动的步数就是通过查找next[ ]数组确定的。
模板
#include<iostream>
using namespace std;
const int N=10010;
char a[N],b[N];//a为匹配串,b为模板串
int n,m;
int next[N];//存在[1,i]位置,最大前缀等于后缀的长度
int main()
{
cin>>n>>m;
cin>>a+1;
cin>>b+1;
//求next[]数组
for(int i=2,j=0;i<=n;i++)
{
while(j&&a[i]!=a[j+1])j=next[j];//如果匹配不成功,那么就退一步
if(a[i]==a[j+1])j++; //匹配成功,字符串向后移动一位
next[i]=j; //储存在第i个位置最大前缀等于后缀的长度
}
//匹配操作
for(int i=1,j=0;i<=m;i++)
{
while(j&&b[i]!=a[j+1])j=next[j];
if(b[i]==a[j+1])j++;
if(j==n)//说明已经匹配成功
{
//进行想要的操作
}
}
}