接上一篇hihocoder上KMP算法题,这段代码本地测试通过,提交超时,难道仅仅是因为用了string而不是数组?如果时间限制这么严格倒是说一下啊,还以为算法有问题!
#include<iostream>
#include<string>using namespace std;
void kmpNext(string pattern, int* p){
p[0] = 0;
int k = 0, m = pattern.size();
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(string str, int start, string pattern, int k, int *p){
int i = start, n = str.size(), m = pattern.size();
while(i < n){
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(string str, string pattern, int *p){
int ret = 0;
int i = 0;
int k = 0;
int n = str.size(), m = pattern.size();
while(i < n){
int idx = kmp(str, i, pattern, k, p);
if(idx == -1) break;
ret++;
k = p[m-1];
i = idx + m;
}
return ret;
}
int main(){
int N;
cin >> N;
int p[10001];
string pattern;
string str;
for(int i = 0; i < N; i++){
cin >> pattern;
cin >> str;
// int m = strlen(pattern);
kmpNext(pattern, p);
int num = match(str, pattern, p);
cout<<num<<endl;
}
}
浙公网安备 33010602011771号