原题链接:http://poj.org/problem?id=3461
分析:求一个串在另一个串中出现的次数,显然用KMP可以解决。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn1 10005
#define maxn2 1000005
using namespace std;
char s[maxn1],t[maxn2];
int next[maxn1],sum,len1,len2;
void get_next()
{
int i,j;len1=strlen(s);
next[]=-;
i=;j=-;
while(i<len1){
if(j==-||s[i]==s[j]){
i++;j++;
next[i]=j;
}
else j=next[j];
}
}
void kmp()
{
sum=;
get_next();
int i=-,j=-;len2=strlen(t);
while(i<len2){
if(j==-||t[i]==s[j])
{
i++;j++;
}
else j=next[j];
if(j==len1){
sum++;
j=next[j];
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s%*c%s",s,t);
kmp();
printf("%d\n",sum);
}
return ;
}