Skip to content

Knuth Morris Pratt

C++

template <class T>
std::vector<int> KMP(std::vector<T> &v) {
    int N = v.size(), j = -1;
    std::vector<int> A(N + 1);
    A[0] = -1;
    for (int i = 0; i < N; i++) {
        while (j >= 0 && v[i] != v[j])
            j = A[j];
        if (i < N - 1 and v[i + 1] == v[j])
            A[i + 1] = A[++j];
        else
            A[i + 1] = ++j;
    }
    return A;
}

std::vector<int> KMP(std::string &s) {
    int N = s.size();
    std::vector<char> v(N);
    for (int i = 0; i < N; i++)
        v[i] = s[i];
    return KMP(v);
}

Reference