暑假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;
}