【模板】KMP算法

之前为了写个龟速乘的模板,一来劲就写成了详解……
所以,为了不花太多的时间整理模板(至少现在还不行我还有一大堆要学呢 ),我就学习下大佬,联赛之后统一更新模板题吧~
先放上代码,日后详解:
(要不是考了一次这个,我到现在都还不会呢……)

#include<bits/stdc++.h>
using namespace std;
const int N=10e5+5;
#define rint register int
#define ivoid inline void
#define iint inline int 
using namespace std;
int a1[N],a2[N],kmp[N];
char c1[N],c2[N];
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
int mx,my,mmx,mmy,sum,ans,tot,pp,qq,rr,tt,uu;
int spzz;
int main()
{
	while(1)
	{
		ans=0;spzz=0;
		cin>>c1+1;
		if(c1[1]=='#'&&c1[2]==0)
		break;
		cin>>c2+1;
		pp=strlen(c1+1),qq=strlen(c2+1);
		j=0;
		for(rint i=2;i<=qq;i++)//自己与自己配对,给出失配指针
		{
			while(j&&c2[i]!=c2[j+1])j=kmp[j];//不能匹配就跳到失配指针处
			if(c2[i]==c2[j+1])j++;//能匹配就继续
			kmp[i]=j;//标记失配指针
		}
		j=0;
		for(rint i=1;i<=pp;i++)//利用失配指针二次匹配
		{
			while(j&&c1[i]!=c2[j+1])j=kmp[j];//不能匹配时就跳到失配指针处
			if(c1[i]==c2[j+1])j++;//能匹配就继续匹配
			if(j==qq)//这是要求子串不能重复的情况下
			{
				j=0;
				ans++;
			}
		}
		cout<<ans<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/Cyan_rose/article/details/83067523