您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: