poj3461_kmp模版

模版题。。其实我本来还是喜欢用string的但是尽然超时了所以只好改用字符型数组。。。。。


现在重新复习kmp,感觉有些遗忘了所以补充一些。。

kmp大概就是有两个字符串a和b,然后问b是否是a的子串

当然通常的方法就是每位比较,然后kmp算法就是通过在b串上建立next数组来改进他的

所以kmp适合的一个问题就是:给很多的a串和一个b串,问b是那些a串的子串

#include
#include
#include
#include

using namespace std;

char s[1000010],p[1000010];
int next[11111],len_s,len_p;

void get_next()
{
	int j=0;
	next[1]=0;
	int i;
	for(i=2;i<=len_s;i++)
	{
		while(j>0&&s[j+1]!=s[i])
			j=next[j];
		if(s[j+1]==s[i])
			j++;
		next[i]=j;
	}
}

int kmp()
{
	int i,j=0,cnt=0;
	for(i=1;i<=len_p;i++)
	{
		while(j>0&&s[j+1]!=p[i])
			j=next[j];
		if(s[j+1]==p[i])
			j++;
		if(j==len_s)
		{
			cnt++;
			j=next[j];
		}
	}
	return cnt;
}

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s%s",s+1,p+1);
		len_s=strlen(s+1);
		len_p=strlen(p+1);
		get_next();
		printf("%d\n",kmp());
	}
	return 0;
}

你可能感兴趣的:(水题,poj,字符串)