题目的意思也很好理解。就是给你n对字符串,求每对中第一串在第二串中出现的次数。
直接N次KMP即可。
要记熟next的计算过程和kmp的匹配过程!
具体细节看代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> const int M=1e6+10; using namespace std; int next[M],len,len1; char b[M],c[M]; void makenext() { memset(next,0,sizeof(next)); for(int i=2,j=0;i<=len;i++) { while(j&&b[i]!=b[j+1])j=next[j]; if(b[j+1]==b[i])j++; next[i]=j; } } int kmp() { int sum=0; for(int i=1,j=0;i<=len1;i++){ while(j&&c[i]!=b[j+1])j=next[j]; if(c[i]==b[j+1])j++; if(j==len)sum++; } return sum; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%s",b+1); scanf("%s",c+1); len=strlen(b+1); len1=strlen(c+1); makenext(); printf("%d ",kmp()); } return 0; }