这题是个KMP模板题,具体做法就不阐述了。
关于KMP,可参考从头到尾彻底理解KMP(2014年8月4日版) 。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686
#include<stdio.h>
#include<string.h>
char s[1000000],p[10001];
int next[10001];
void getnext()
{
int plen=strlen(p),k=0,j=1;
next[0]=-1;next[1]=0;
while (j<plen)
{
if (k==-1||p[j]==p[k])
{
k++;j++;
next[j]=k;
}
else k=next[k];
}
}
int kmp()
{
int plen=strlen(p),slen=strlen(s),i=0,j=0,num=0;
while(i<slen)
{
if(j==-1||p[j]==s[i])
{
i++;
j++;
if(j>=plen)
{
j=next[j];
num++;
}
}
else j=next[j];
}
return num;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",p,s);
getnext();
printf("%d\n",kmp());
}
return 0;
}