题目链接: https://vjudge.net/contest/70325#problem/B
题意: 输出模式串在主串中出现的次数
思路: kmp模板
在 kmp 函数中匹配成功计数加一, 再令 j = nxt[j] 即可.
感觉有点奇怪的就是我拿 A 题的模板写这题居然会 tle, 而拿这题的模板写 A 题又没有 A 题的模板跑的快...可能是数据特殊吧:) .
代码:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 const int MAXN = 1e6 + 10; 7 char a[MAXN], b[MAXN]; 8 int nxt[MAXN], n, m; 9 10 void get_nxt(void){ 11 memset(nxt, 0, sizeof(nxt)); 12 int j = -1, i = 0; 13 nxt[0] = -1; 14 while(i < m){ 15 if(j == -1 || b[j] == b[i]){ 16 nxt[i + 1] = j + 1; 17 i++; 18 j++; 19 }else j = nxt[j]; 20 } 21 } 22 23 int kmp(void){ 24 get_nxt(); 25 int i = 0, j = 0, ans = 0; 26 while(i < n && j < m){ 27 if(j == -1 || a[i] == b[j]){ 28 i++; 29 j++; 30 }else j = nxt[j]; 31 if(j == m){ 32 ans++; 33 j = nxt[j]; 34 } 35 } 36 return ans; 37 } 38 39 int main(void){ 40 int t; 41 scanf("%d", &t); 42 while(t--){ 43 scanf("%s%s", b, a); 44 n = strlen(a); 45 m = strlen(b); 46 printf("%d ", kmp()); 47 } 48 return 0; 49 }