题目链接:https://vjudge.net/problem/POJ-3461
题意:给出主串和模式串,求出模式串在主串中出现的次数。
思路:kmp板子题。
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1e6+5; int T,next[maxn],len1,len2; char s1[maxn],s2[maxn]; //得到next数组 void get_next(){ next[0]=-1; int j=-1; for(int i=1;i<len2;++i){ while(j>-1&&s2[j+1]!=s2[i]) j=next[j]; if(s2[j+1]==s2[i]) ++j; next[i]=j; } } //输出模式串在主串上依次出现的下标 void kmp_index(){ int j=-1; for(int i=0;i<len1;++i){ while(j>-1&&s1[i]!=s2[j+1]) j=next[j]; if(s1[i]==s2[j+1]) ++j; if(j==len2-1){ j=next[j]; printf("%d\n",i-len2+1); } } } //返回模式串在主串上出现的次数 int kmp_count(){ int cnt=0,j=-1; for(int i=0;i<len1;++i){ while(j>-1&&s1[i]!=s2[j+1]) j=next[j]; if(s1[i]==s2[j+1]) ++j; if(j==len2-1){ ++cnt; j=next[j]; } } return cnt; } int main(){ scanf("%d",&T); while(T--){ scanf("%s%s",s2,s1); len1=strlen(s1); len2=strlen(s2); get_next(); printf("%d\n",kmp_count()); } return 0; }