KMP

按从小到大的顺序输出s2在s1中出现的位置。

//KMP算法  (前缀)   kmp[0] = kmp[1] = 0
int nxt[N];
string s1, s2;
void KMP(int len, string s)
{
    int j = 0;
    s = " " + s;
    for (int i = 2; i <= len; i++)
    {
        while (j && s[j + 1] != s[i])
            j = nxt[j];
        if (s[j + 1] == s[i])
            j++;
        nxt[i] = j;
    }
}
inline void solve() {
    cin >> s1 >> s2;
    int l1 = s1.size(), l2 = s2.size();
    KMP(l2, s2);
    s1 = " " + s1, s2 = " " + s2;
    int j = 0;
    for (int i = 1; i <= l1; i++) {
        while (j&&s2[j + 1] != s1[i])
            j = nxt[j];
        if (s2[j + 1] == s1[i]) j++;
        if (j == l2) {
            cout << i - l2 + 1 << endl;//匹配成功,输出s2在s1中出现的位置
            j = nxt[j];
        }
    }
}

Last updated