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