本人对KMP如何匹配到所有结果的算法存在一些疑惑...

复制代码
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            佛祖保佑       永无BUG

    writtern-by:Tokisaki Kurumi   ( 时崎狂三 )
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;

void GetNext(string s2, int *next)
{
    int i = 0, j = -1;
    next[0] = -1;
    while (i < (int)s2.length())
    {
        if (j == -1 || s2[i] == s2[j])
        {
            next[++i] = ++j;
        }
        else
        {
            j = next[j];
        }
    }
}

void MultipleKMP(string s1, string s2, int *next, vector<int> &v)
{
    int i = 0, j = 0;
    while (i < (int)s1.length() && j < (int)s2.length())
    {
        if (j == -1 || s1[i] == s2[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
        if (j == (int)s2.length())
        {
            v.push_back(i - j);
            i = i - j + 1; // 网传这一步还可以写成next[j] ,事实也确实如此,但我理解不了其含义,因为next显然到不了[s2.length()]这个位置。
            j = 0;
        }
    }
}

int main()
{
    int *next;
    string s1, s2;
    cin >> s1 >> s2;
    next = new int[s2.length() + 1];
    vector<int> v;
    GetNext(s2, next);
    MultipleKMP(s1, s2, next, v);
    for (int i : v)
    {
        cout << i << " ";
    }
    cout << "\n";
    return 0;
}

就是我批注的这一步,我实在是不太理解...

OK,下面是占字数的小说,可以不看!!!

磁带转动时发出的沙沙声总是让周明感到一种奇异的安宁。这种老旧的媒介在数字音乐泛滥的今天已经很少有人问津,但正是这种复古感让他着迷。周明轻轻擦拭着刚从旧货市场淘来的Walkman随身听,这是他花了两百块钱从一个满脸皱纹的老人那里买来的,据说是九十年代的存货,从未拆封。

宿舍窗外下着小雨,潮湿的空气里弥漫着泥土的气息。周明看了看手表------下午三点二十分,室友们都去上课了,这正是一个安静听音乐的好时机。他从书包里掏出今天最大的收获:一盒没有标签的黑色录音带,外壳已经有些泛黄,边缘处有几道细微的裂痕。

"老板说这盒带子是随随身听一起的,不知道里面录了什么。"周明自言自语道,小心翼翼地将磁带放入随身听。他戴上耳机,按下播放键,等待了几秒钟后,一阵刺耳的电流杂音从耳机里炸开,吓得他差点把随身听扔出去。

杂音持续了大约十秒,然后突然停止了。接着,一个低沉而颤抖的男声从耳机里传来:

"如果有人听到这段录音...我不知道这盒带子最终会落到谁手里,但请听我说完..."

周明的手指僵在了暂停键上方。这不是他预想中的音乐,而似乎是某个人的独白。声音听起来很紧张,时不时被急促的呼吸声打断。

"我叫林森,林森。如果...如果我已经不在了,这段录音可能就是唯一能证明我曾经存在过的东西。"

窗外一道闪电划过,随即是一声闷雷。周明的后背窜上一阵凉意,他不由自主地调大了音量。

"我被困在这里已经...不知道多少天了。没有光,只有黑暗和老鼠的声音。他们每天只给我一顿饭,水也快喝完了..."

录音中传来金属碰撞的声响,像是有人在摇晃铁门。那个自称林森的男人声音变得更加急促:"他们来了!我得快点说...地下室的门,记住是左边第三个书架后面...钥匙在花盆底下...他们不会让我离开这里了..."

录音戛然而止,只剩下空转的磁带声。周明猛地按下停止键,宿舍里突然变得异常安静,只有他的心跳声在耳边咚咚作响。

"这到底是什么?"周明摘下耳机,盯着那盒磁带,仿佛它会突然咬他一口。他翻来覆去检查磁带外壳,希望能找到更多线索,但除了岁月留下的磨损痕迹外,什么也没有。

周明拿起手机,犹豫了一下,还是打开了搜索引擎,输入"林森 失踪"几个关键字。页面刷新后,几条新闻标题引起了他的注意:

《本市悬案:出版社编辑离奇失踪三年未破》 《警方称林森失踪案仍无线索,家属悬赏寻人》

周明点开第一条新闻,一张黑白照片映入眼帘------一个戴着眼镜、面容清瘦的年轻男子,正是新闻中报道的失踪者林森,三年前从家中离开上班后便再未出现。报道中提到,林森最后被监控拍到是在城西的一家咖啡馆外,之后便如人间蒸发一般。

"左边第三个书架...花盆底下的钥匙..."周明喃喃重复着录音中的线索,一种莫名的使命感在他心中升起。他看了看窗外渐暗的天色,雨下得更大了。

正当他准备进一步搜索时,手机突然震动起来,一个陌生号码出现在屏幕上。周明迟疑地接起电话,对方却沉默不语,只有细微的电流声从听筒中传来。

"喂?"周明问道。

电话那头依然没有回应,几秒钟后,通话被挂断了。周明盯着手机屏幕,一种被监视的异样感油然而生。他回头看向那盒静静躺在桌上的黑色录音带,突然意识到自己可能无意中卷入了一个危险的谜团之中。

窗外,雨点拍打玻璃的声音越来越急,像是某种不祥的预兆。周明小心地将录音带放入抽屉锁好,却不知道这个简单的动作,已经开启了一连串无法回头的事件...