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。
由于蒟蒻太弱了,能让你帮忙解释一下这一行是什么意思吗?
感激不尽。