求调 30pts #5,6,10,13WA 其他AC
查看原帖
求调 30pts #5,6,10,13WA 其他AC
1050603
MichaelQiu楼主2024/1/22 22:11

最后的前缀函数部分没有问题

但是一开始的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;
}
2024/1/22 22:11
加载中...