萌新妹子求助关于跳 fail 的事情
查看原帖
萌新妹子求助关于跳 fail 的事情
131591
蒟蒻君HJT泽渡透香楼主2023/11/14 23:20

看到了说每次跳 fail 只能匹配长度-- 的帖子,但不是很懂,想问一下我这么写为什么不对:

匹配到某个结点 tt 上,设当前匹配串最后一次出现位置为 xx,则当 x−t+1≤len[fail[t]]x-t+1\leq len[fail[t]] 时往上跳,想法是 (len[fail[t]],len[t]](len[fail[t]],len[t]] 这一段之间的肯定匹配不了了

部分代码:

while(now){
      if(!SAM::tr[now][s[i] - 'a']) now = SAM::link[now], plen = SAM::len[now];
      else {
        int t = SAM::tr[now][s[i] - 'a'];
        if(SAM::ask(SAM::root[t], 1, n, l, r) - l + 1 <= SAM::len[SAM::link[t]]){
          now = SAM::link[now];
          plen = SAM::len[now];
        }
        else break;
      }
    }
    if(!SAM::tr[now][s[i] - 'a']) plen = 0;
    else {
      int t = SAM::tr[now][s[i] - 'a'];
      if(SAM::ask(SAM::root[t], 1, n, l, r) - l + 1 <= SAM::len[SAM::link[t]]) plen = 0;
      else ++plen, now = t;
    }
2023/11/14 23:20
加载中...