关于j = nxt[j - 1]
查看原帖
关于j = nxt[j - 1]
773659
Elysia11115480楼主2024/8/5 23:34

rt.

注意看,这个蒟蒻在学习KMP,但他肥肠的疑惑,这一行代码加上去有何意义?

j = nxt[j - 1];

也就是下面这串代码的第30行

完整代码如下:

#include<bits/stdc++.h>
//luoguP3375
using namespace std;
typedef long long ll;

int slen, tlen, j;
int nxt[1000005];
string s, t;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> s >> t;
    slen = s.size(), tlen = t.size();
    j = 0, nxt[0] = 0;
    for (int i = 1;i < tlen; ++i)
    {
        while (j && t[i] != t[j]) j = nxt[j - 1];
        if (t[i] == t[j]) ++j;
        nxt[i] = j;
    }
    j = 0;
    for (int i = 0;i < slen; ++i)
    {
        while (j && s[i] != t[j]) j = nxt[j - 1];
        if (s[i] == t[j]) ++j;
        if (j == tlen)
        {
            cout << i - tlen + 1 + 1 << '\n';
            j = nxt[j - 1];
        }
    }
    for (int i = 0;i < tlen; ++i)
        cout << nxt[i] << ' ';
    cout.flush();
    return 0;
}

蒟蒻请教了舍友,舍友表示这一行加不加无所谓。于是蒟蒻去掉了第三十行,仍然AC。

由于蒟蒻太弱了,能让你帮忙解释一下这一行是什么意思吗?

感激不尽。

2024/8/5 23:34
加载中...