zoj 3957 kmp 算法
来源:互联网 发布:数据行业 编辑:程序博客网 时间:2024/05/21 17:10
In computer science, the Knuth-Morris-Pratt string searching algorithm (or KMP algorithm) searches for occurrences of a "word" W within a main "text string" S by employing the observation that when a mismatch occurs, the word itself embodies sufficient information to determine where the next match could begin, thus bypassing re-examination of previously matched characters.Edward is a fan of mathematics. He just learnt the Knuth-Morris-Pratt algorithm and decides to give the following problem a try:Find the total number of occurrence of the strings "cat" and "dog" in a given string s.As Edward is not familiar with the KMP algorithm, he turns to you for help. Can you help Edward to solve this problem?
Input
There are multiple test cases. The first line of input contains an integer T (1 ≤ T ≤ 30), indicating the number of test cases. For each test case:The first line contains a string s (1 ≤ |s| ≤ 1000).
Output
For each case, you should output one integer, indicating the total number of occurrence of "cat" and "dog" in the string.
Sample Input
7catcatcatdogggydocadosfascatdogdddcatcatcatcatcatccatdogdogdogddddooogdcoagtcatdoogdog
Sample Output
4125311
Hint
For the first test case, there are 3 "cat" and 1 "dog" in the string, so the answer is 4.For the second test case, there is only 1 "cat" and no "dog" in the string, so the answer is 1.
#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 1000 + 50;int next[100];char s[maxn];int ans;void getnext(char t[], int next[]){ int j = 0 , i = -1; next[0] = -1; while(t[j] != '\0'){ if(i == -1) next[++j] = 0, i = 0; else if(t[j] == t[i]){ i++; next[++j] = i; } else i = next[i]; }}void kmp(char s[], char t[]){ int i = 0 , j = 0 ; getnext(t, next); while(s[i] != '\0' && t[j] != '\0'){ if(s[i] == t[j]) i++, j++; else { j = next[j]; if(j == -1){i++, j++;} } } if(t[j] == '\0'){ ans++; kmp(s+i-strlen(t)+1, t); } return ;}int main(){ int n, m, res; char t1[] = "cat"; char t2[] = "dog";// getnext(t1, next);// getnext(t2, next); while(cin >> n){ while(n--){ ans = 0; cin >> s; kmp(s, t1); kmp(s, t2); cout << ans << endl; } } return 0;}
0 0
- zoj 3957 kmp 算法
- zoj——3957多重KMP
- 【KMP】ZOJ 3587
- zoj 2177 Period (KMP )
- ZOJ 3587 扩展KMP
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- 悼念512汶川大地震的同胞
- (转)Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
- unity3d 本地存储选择
- 排序算法的总结(一)
- 207. Course Schedule (Medium)&& 210. Course Schedule II(Medium)
- zoj 3957 kmp 算法
- 欢迎使用CSDN-markdown编辑器
- Light Bulb
- Notepad++使用技法
- pat 1104. Sum of Number Segments
- 排序算法三:希尔插入排序
- 数值的整数次方
- 常用编辑器个人偏好设置
- 最长上升子序列——动态规划