社区讨论
70分TLE求助
P3375【模板】KMP参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjgsyvuu
- 此快照首次捕获于
- 2025/12/22 14:56 3 个月前
- 此快照最后确认于
- 2025/12/22 14:59 3 个月前
没有在循环内使用
Clength()#include <iostream>
#include <string>
#include <vector>
int fastFind(std::string& str_t, std::string& str_p, int k, std::vector<int>& next) {
int pos_p = 0, pos_t = k;
int len_p = str_p.length();
int len_t = str_t.length();
while (pos_p < len_p && pos_t < len_t) {
if (pos_p == -1 || str_p[pos_p] == str_t[pos_t]) {
pos_p++; pos_t++;
} else {
pos_p = next[pos_p];
}
}
if (pos_p < len_p) return -1;
return pos_t - len_p;
}
void generateNext(std::string& str, std::vector<int>& next) {
next[0] = -1;
int len = str.length();
int j = 0, k = -1;
while (j < len) {
if (k == -1 || str[j] == str[k]) {
j++; k++;
next[j] = k;
} else {
k = next[k];
}
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
std::string s1, s2;
std::cin >> s1 >> s2;
int len1 = s1.length(), len2 = s2.length();
std::vector<int> next(len2 + 1, 0);
generateNext(s2, next);
int pt = 0;
while (pt <= len1 - len2) {
int result = fastFind(s1, s2, pt, next);
if (result != -1) {
std::cout << result + 1 << std::endl;
pt = result + 1;
} else {
break;
}
}
for (int i = 1; i <= len2; ++i) {
std::cout << next[i] << " ";
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...