今天又被科普了一下:kmp——k(kan)m(mao)p(pian)
其实说实话,这个字符串算法理解起来还是非常的困难的,而且我在网上看到的一些资料都是各说各的,仿佛都很有道理,但是都写得还不够全面,所以学习这一板板块得知识,我是自己看的视频,这里我就推荐几个,大家可以在B站上搜一搜,其实都讲的还是非常的好的,“小甲鱼的数据结构”还有B站搜KMP算法的第一篇。
题目传送门:P3375 【模板】KMP字符串匹配
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[1000100],b[1000100];
int next[1000100];
int main()
{
scanf("%s%s",a+1,b+1);
int la=strlen(a+1),lb=strlen(b+1);
int j=0;
next[1]=0;
//先处理出next数组,无非是b和自己匹配,与b和a匹配一样,故代码差不多
for(int i=2;i<=lb;i++)
{
while(j>0 && b[i]!=b[j+1]) j=next[j];//往前翻记录了有相同前缀的j
if(b[i]==b[j+1]) j++;//i匹配成功了,i继续往后
next[i]=j;//更新当前的next数组
}
j=0;
for(int i=1;i<=la;i++)
{
while(j>0 && a[i]!=b[j+1]) j=next[j];
if(a[i]==b[j+1]) j++;
if(j==lb) printf("%d
",i-lb+1),j=next[j];//虽然成功匹配但是可以把他当作成并没有成功匹配
}
for(int i=1;i<lb;i++)
printf("%d ",next[i]);
printf("%d",next[lb]);
return 0;
}
by njc