题意:求短串在长串中有几个.
分析:直接kmp模版.因为next是指短串对自身的匹配,其中的数字next[i]一定满足s[0~next[i]-1]与s[i-next[i]+1~i]是相同的串,所以很显然可以用此方法求出在长串对短串的匹配,如果j==lenb,则证明有该串.
wa的原因:1A
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int M=1000005;
char s[M],t[M];
int next[M],sum,n,m,cas;
inline void get_next()
{
next[0]=-1;
int i,j=-1;
for(i=1;i<m;i++)
{
while(j!=-1&&t[i]!=t[j+1])j=next[j];
if(t[j+1]==t[i])j++;
next[i]=j;
}
}
int kmp()
{
int j=-1,i;
get_next();
for(i=0;i<n;i++)
{
while(j!=-1&&t[j+1]!=s[i])j=next[j];
if(t[j+1]==s[i])j++;
if(j==m-1)
{
sum++;
j=next[j];
}
}
return sum;
}
int main()
{
scanf("%d",&cas);
while(cas--)
{
scanf("%s%s",t,s);
sum=0;
n=strlen(s);
m=strlen(t);
printf("%d\n",kmp());
}
return 0;
}