HDU2087(kmp,两字符串匹配模板)

解题思路:其实就是kmp匹配,但是有一点区别就是,匹配时j==l2-1时,不是j=next[j]而是j=-1从头开始

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int nxt[1005];
void build_nxt(char s[])
{
	int i=1,j=-1,l=strlen(s);
	while(i<l)
	{
		while(j!=-1&&s[j+1]!=s[i])
			j=nxt[j];
		if(s[j+1]==s[i]) j++;
		nxt[i]=j;
		i++;
	}
}
int main()
{
	//freopen("t.txt","r",stdin);
	char s1[1005],s2[1005];
	nxt[0]=-1;
	while(scanf("%s",s1)!=EOF)
	{
		if(s1[0]=='#') break;
		scanf("%s",s2);
		build_nxt(s2);
		int i=0,j=-1,l1=strlen(s1),l2=strlen(s2),ans=0;
		while(i<l1)
		{
			while(j!=-1&&s2[j+1]!=s1[i])
			j=nxt[j];
			if(s2[j+1]==s1[i]) j++;
			if(j==l2-1) 
			{
				j=-1;
				ans++;
			}
			i++;
		}
		printf("%d\n",ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39861441/article/details/88570567