POJ 3461 Oulipo KMP模板

暑假ACM俱乐部训练三周,内容分别是图论基础、区间数据结构、字符串处理。
训练题虽说都是类似模板题,但初学的我想弄明白还是有些困难的,经常一道题就坐在那里想半天,但做出来还是非常有成就感。每天打下一点点基础,有收获就通过博客记录下来,也方便以后回过头来复习查看。

[题目大意]
每个小的样例输入两个字符串,输出一个字符串在另一个字符串中出现(是其子串)的次数。

[样例输入]
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

[样例输出]
1
3
0

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char str[1000005],pat[10005];
int nxt[10005];
void getnext()
{
	int i=0,j=-1;
	int len=strlen(pat); 
	nxt[0]=-1;
	while(i<len)
	{
		if(j==-1||pat[i]==pat[j])
			nxt[++i]=++j;
		else
			j=nxt[j];
	}
	return;
}
int kmp()
{
	int i=0,j=0,len1=strlen(str),len2=strlen(pat),ans=0;
	while(i<len1)
	{
		if(j==-1||str[i]==pat[j])
			i++,j++;
		else
			j=nxt[j];
		if(j==len2)
			ans++;
	}
	return ans;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",&pat[0]);
		scanf("%s",&str[0]);
		getnext();
		printf("%d\n",kmp());
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46283740/article/details/107503201
今日推荐