本题链接:点击打开链接
本题是求一个主字符串中有多少个子字符串,先输入的是子字符串;本题解法呢,就是采用KMP算法,先对子字符串本身进行编号,首字符标为-1,第二个字符标为0,然后下一位的标法遵循一个准则:若前一位与其所对应下标对应的字符相等,则标记为前一个字符的下标值加一,若不等,则将前一位与刚所比较那个字符对应下标所对应的字符相比较,直至比较到子字符串首,若仍不等,则此字符的下标应为0;对子字符串标号完毕就可以进行与主字符串的比较了,此法效率较高。
参考代码:
#include<stdio.h>
#include<string.h>
#define LEN 1000010
char str[LEN], buf[LEN];
int p[LEN];
int lens,lenb,cnt;
void getnext()
{
int i=0,j=-1;
p[0]=-1;
while(i<lens)
{
if(j==-1||str[i]==str[j])
{
i++;j++;
p[i]=j;
}
else
j=p[j];
}
}
void kmp()
{
int i=0,j=0;
while(i<lenb)
{
if(j==-1||str[j]==buf[i])
{
i++;j++;
if(j==lens)
cnt++;
}
else
j=p[j];
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cnt=0;
scanf("%s%s",str,buf);
lens=strlen(str);
lenb=strlen(buf);
getnext();
kmp();
printf("%d\n",cnt);
}
return 0;
}