hdu2087kmp,pre函数 隔段时间复习下

#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;
	}
} 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值