题目传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1686
题意: 求一个字符串在另一个字符串中出现的次数,如 AZA 在 AZAZAZAZA出现4次。
题解:一个典型的kmp模版题。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn1 = 10005;
const int maxn2 = 1000005;
char w[maxn1],t[maxn2];
int Next[maxn1];
void makenext(int n)
{
int i,k;
Next[0] = 0;
for(i=1,k=0;i<n;i++){
while(k > 0 && w[i] != w[k]) k = Next[k-1];
if(w[i] == w[k]) k++;
Next[i] = k;
}
}
void kmp(int n1,int n2)
{
makenext(n2);
int cnt = 0;
int i = 0,j = 0;
for(i=0,j=0;i<n1;i++){
while(j == n2 || (j>0 && t[i] != w[j])) j = Next[j-1];
if(t[i] == w[j]) j++;
if(j == n2){
cnt++;
}
}
printf("%d\n",cnt);
}
int main()
{
int kace;
cin >> kace;
while(kace--){
memset(w,0,sizeof(w));
memset(t,0,sizeof(t));
memset(Next,0,sizeof(Next));
scanf("%s %s",w,t);
int n_t = strlen(t);
int n_w = strlen(w);
kmp(n_t,n_w);
}
return 0;
}