#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
char a[maxn],b[maxn];
int nex[maxn];
int n,m;
//pre,kmp函数是按 ab字符串从下标1开始存 得的
//由b串 预处理nex数组
void pre(){
nex[1]=0;
int i,j=0;//i j要错位,因为是在同一个字符串内
for(i=1;i<m;i++){
while(j>0&&b[i+1]!=b[j+1])
j=nex[j];
if(b[i+1]==b[j+1]) j++;
nex[i+1]=j; //每趟循环求的是第i+1位的值
}
}
int kmp(){
int i,j=0,ans=0;
//因为每次比较的是ab串中下一个,所以ij要从0开始
for(i=0;i<n;i++){
while(j>0&&a[i+1]!=b[j+1])//不能继续匹配且j未减少到0
j=nex[j];//j回退
if(a[i+1]==b[j+1]) j++;//能继续匹配
if(j==m) {//找到一处匹配(即b串用完)
j=0;//不可重叠
//j=p[j];可重叠
ans++;
}
}
return ans;
}
int main(){
while(~scanf("%s",a+1)){
if(a[1]=='#') break;
scanf("%s",b+1);
n=strlen(a+1);
m=strlen(b+1);
/*从第k个位置开始存的,求长度就要写(a+k)
原因在strlen在实现时,遇到第一个0x00即终止.
而a[0]=0,所以n=0 同理m=0.所以不能n=strlen(a)-1*/
pre();
cout<<kmp()<<endl;
}
}
hdu2087kmp,pre函数 隔段时间复习下
最新推荐文章于 2022-05-22 23:41:25 发布