KMP

Thuật toán Knuth-Morris-Pratt (KMP)

Độ phức tạp: \(O(N)\)

const int N = 1e6+7;
string s;
int kmp[N];

void buildKMP() {
    kmp[0] = 0;
    for (int i = 1; i < s.size(); ++i) {
        int k = kmp[i-1];
        while (k > 0 && s[k] != s[i]) {
            k = kmp[k-1];
        }
        kmp[i] = k + (s[k]==s[i]);
    }
}

Xây dựng mảng Automaton

Độ phức tạp: \(O(N*26)\)

int aut[N][26];

void buildAutomaton() {
    s += '#';
    for (int i = 0; i < s.size(); ++i)
    for (int c = 0; c < 26; ++c) { // 'a' -> 'z'
        if (i > 0 && c+'a' != s[i]) {
            aut[i][c] = aut[kmp[i-1]][c];
        }
        else {
            aut[i][c] = i + (c+'a' == s[i]);
        }
    }
}

Tham khảo thêm