解题思路:
求不重叠的匹配次数。
参考代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <iostream> 2 #include <vector> 3 #include <map> 4 #include <string> 5 #include <queue> 6 #include <stack> 7 #include <set> 8 #include <algorithm> 9 10 #include <cstdio> 11 #include <cstring> 12 #include <cmath> 13 #include <cstdlib> 14 using namespace std; 15 16 const int INF=0x3f3f3f3f; 17 const int SIZE=10000; 18 typedef long long LL; 19 20 string a,b; 21 int nextt[1000005]; 22 void nexxt() 23 { 24 memset(nextt,0,sizeof(nextt)); 25 int j=0,k=-1; 26 nextt[0]=-1; 27 int len=b.size(); 28 while(j<len) 29 { 30 if(k==-1||b[j]==b[k]) 31 { 32 ++k; 33 ++j; 34 if(b[j]!=b[k]) 35 nextt[j]=k; 36 else 37 nextt[j]=nextt[k]; 38 } 39 else 40 k=nextt[k]; 41 } 42 } 43 44 int kmp() 45 { 46 int i=0,j=0,ans=0; 47 int la=a.size(),lb=b.size(); 48 while(i<la) 49 { 50 if(j==-1||a[i]==b[j]) 51 { 52 i++; 53 j++; 54 // printf("i:%d j:%d\n",i,j); 55 } 56 else 57 j=nextt[j]; 58 if(j==lb) 59 { 60 j=0; 61 ans++; 62 } 63 64 } 65 return ans; 66 67 } 68 69 int main() 70 { 71 while(cin>>a) 72 { 73 if(a=="#") break; 74 cin>>b; 75 nexxt(); 76 printf("%d\n",kmp()); 77 } 78 return 0; 79 }