社区讨论

70分TLE求助

P3375【模板】KMP参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mjgsyvuu
此快照首次捕获于
2025/12/22 14:56
3 个月前
此快照最后确认于
2025/12/22 14:59
3 个月前
查看原帖
没有在循环内使用 length()
C
#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 条回复,欢迎继续交流。

正在加载回复...