题意:输入两个字符串,在第二个字符串中含有多少个子串与第一个字符串相同。
改写写KMP算法
#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int ans;
char sa[10010],sb[1000001];
int fail[10010];
int kmp(char* str, char* pat)
{
int i, j, k;
memset(fail, -1, sizeof(fail));
for (i = 1; pat[i]; ++i)
{
for (k=fail[i-1]; k>=0 && pat[i]!=pat[k+1];
k=fail[k]);
if (pat[k + 1] == pat[i]) fail[i] = k + 1;
}
i = j = 0;
while( str[i] ) // By Fandywang
{
if( pat[j] == str[i] ) ++i, ++j;
else if(j == 0)++i;//第一个字符匹配失败,从str下个字符开始
else j = fail[j-1]+1;
if(!pat[j])
{
ans++;
j=fail[j-1]+1;
}
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s%s",sa,sb);
ans=0;
kmp(sb,sa);
cout<<ans<<endl;
}
return 0;
}