YbtOJ KMP算法课堂过关 例1 子串查找【KMP】

在这里插入图片描述


这道题是KMP模板题,具体的KMP我会单独写一篇博客来讲述。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ans,next[1010010],longys,longmbs;
char ys[1001010],mbs[1001010];
void find_next()
{
    
    
	int k=0;
	for(int i=2; i<=longmbs; i++)
	 {
    
    
	 	while(k>0&&mbs[k+1]!=mbs[i])
	 	  k=next[k];
	 	if(mbs[k+1]==mbs[i])
	 	  k++;
	 	next[i]=k;
	 }
}
void kmp()
{
    
    
	find_next(); 
	int k=0;
	for(int i=1; i<=longys; i++)
	 {
    
    
	 	while(k>0&&mbs[k+1]!=ys[i])
	 	  k=next[k];
	 	if(mbs[k+1]==ys[i])
	 	  k++;
	 	if(k==longmbs)
	 	 {
    
    
	        ans++;
	 	 	k=next[k];
		 }
	 }
}
int main()
{
    
    
	scanf("%s",ys+1);
	scanf("%s",mbs+1);
	longys=strlen(ys+1);
	longmbs=strlen(mbs+1);
	kmp();
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Jackma_mayichao/article/details/114731064