hihocoder #1015 : KMP算法
2015-04-22 21:05
288 查看
hihocoder.com 上的KMP算法题,搞了半天在VS2012是能通过的,提交上去就是有问题,反复改终于通过了,记录在此,以下是测试通过代码。
输入
第一行一个整数N,表示测试数据组数。接下来的N^2行,每两行表示一个测试数据。在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不超过10^6个大写字母组成。
其中N<=20
输出
对于每一个测试数据,按照它们在输入中出现的顺序输出一行Ans,表示模式串在原串中出现的次数。样例输入
5 HA HAHAHA WQN WQN ADA ADADADA BABABB BABABABABABABABABB DAD ADDAADAADDAAADAAD
样例输出
3 1 3 1 0
#include<iostream> //vs2012里用#include<string>即可,G++非要让用.h,原因是strlen()在G++里定义在string.h头文件里,不常用G++,折腾半天 #include<string.h>using namespace std; void kmpNext(char* pattern, int m, int* p){ p[0] = 0; int k = 0; for(int i = 1; i < m; i++){ while(k > 0 && pattern[k] != pattern[i]){ k = p[k-1]; } if(pattern[k] == pattern[i]){ p[i] = ++k; }else{ p[i] = 0;//k == 0 } } } int kmp(char* str, int start, char* pattern, int k, int m, int *p){ // int k = 0; int i = start; while(str[i] != '\0'){ while(k > 0 && str[i] != pattern[k]) k = p[k-1]; if(str[i] == pattern[k]){ k++; if(k == m) return i - m + 1; } i++; } return -1; } int match(char* str, char* pattern, int m, int *p){ int ret = 0; int i = 0; int k = 0; while(str[i] != '\0'){ int idx = kmp(str, i, pattern, k, m, p); if(idx == -1) break; ret++; k = p[m-1]; i = idx + m; } return ret; } int main(){ int N; cin >> N; char pattern[10001]; char str[1000001]; int p[10001]; // char *pattern = new char[10001]; // char *str = new char[1000001]; // int *p = new int[10001]; for(int i = 0; i < N; i++){ //getline(cin, pattern[i]); //getline(cin, str[i]); cin >> pattern; cin >> str; int m = strlen(pattern); kmpNext(pattern, m, p); int num = match(str, pattern, m, p); cout<<num<<endl; } // delete []pattern; // delete []str; // delete []p; }
相关文章推荐
- hihoCoder #1015 KMP算法
- hihoCoder #1015之KMP算法
- hihoCoder #1015 : KMP算法
- hihoCoder #1015 : KMP算法
- hihoCoder 1015 KMP算法
- #1015 : KMP算法
- hiho一下第3周#1015 : KMP算法
- hihoCoder 1015 KMP算法
- hihoCoder 1015 KMP算法
- #1015 : KMP算法
- hiho 1015 : KMP算法
- hihoCoder 1015 : KMP算法
- #1015 : KMP算法
- hihocoder#1015之KMP算法
- hihoCoder 1015 kmp算法
- KMP算法模板及问题解决(HDU 1711)(hihocoder 1015 KMP)(HDU 1686)(POJ3461)(HDU1358)
- HIHO code 1015 KMP算法 【KMP OR EXMP】
- #1015 : KMP算法
- (hiho一下第三周)#1015 KMP算法 【模版】
- 1015 : KMP算法