YbtOJ——KMP 算法【例题1】子串查找

A. 【例题1】子串查找

题目

在这里插入图片描述终于学会了KMP !
板子就不解释了,贴上一篇别人的KMP好文:数据结构KMP算法配图详解(超详细)

代码

#include<iostream>
using namespace std;
string a,b;
int p[100001],n,ans;
void in()
{
	cin>>a>>b;
}
void pre(string s)//预处理最长相同前缀后缀
{
	p[0]=-1;
	p[1]=0;
	int j=0,k=-1;
	while(j<s.size()-1)
	{
		if(k==-1||s[j]==s[k])//若两字符相同,则两个比较字符同时前进
		{
			k++;
			j++;
			p[j]=k;
		}
		else k=p[k];//否则子串的比较字符返回最长相同前缀后缀的位置
	}
}
void kmp()
{
	pre(b);
	int i=-1,j=-1;
	while(i<0||i<a.size())
	{
		while(j>=0&&a[i+1]!=b[j+1]) j=p[j];//不断回溯直到两个比较字符相同
		if(a[i+1]==b[j+1])//若两字符相同,则两个比较字符同时前进
		{
			i++;
			j++;
		}
		else i++;
		if(j==b.size()-1)//若查找到一处答案,子串的比较字符回溯并继续查找。
		{
			ans++;
			j=p[j]; 
		}
	}

}
int main()
{
	in();
	kmp();
	cout<<ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值