最后的前缀函数部分没有问题
但是一开始的KMP在如标题所示的几个点少搜索了几个(输出的答案缺了几项)
源码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
using namespace std;
vector<int> getPrefix(const string patt);
vector<int> getNext(string p);
int main() {
string s, p;
cin >> s >> p;
int slen = s.length(), plen = p.length();
vector<int> next = getNext(s);
int j=0;
for (int i=0; i < slen; i++) { // 搜索
while (j && s[i] != p[j]) j = next[j];
if (s[i] == p[j]) ++j;
if (j == plen) {
cout << i - plen + 2 << endl;
}
}
// 输出前缀函数(这部分没问题
vector<int> prefixes = getPrefix(p);
for (int ele : prefixes) cout << ele << " ";
puts("");
return 0;
}
vector<int> getNext(string p) {
// next数组
int plen = p.length();
vector<int> next(plen);
next[0] = next[1] = 0;
int j = 0;
for (int i = 1; i < plen; i++) {
j = next[i];
while (j && p[i] != p[j]) j = next[j];
next[i+1] = (p[i] == p[j]) ? j+1 : 0;
}
return next;
}
vector<int> getPrefix(const string patt) {
// 前缀函数(这部分没问题
int n = patt.length();
vector<int> prelist;
prelist.push_back(0);
int prelen = 0;
int i = 1;
while (i < n) {
if (patt[prelen] == patt[i]) {
++prelen;
prelist.push_back(prelen);
++i;
}
else if (prelen == 0) {
prelist.push_back(0);
++i;
}
else
prelen = prelist[prelen - 1];
}
return prelist;
}