kuangbin专题16B(kmp模板)

题目链接: 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\n", kmp());
47     }
48     return 0;
49 }
View Code

 

posted @ 2017-08-09 20:18  geloutingyu  阅读(259)  评论(0编辑  收藏  举报