看到了说每次跳 fail 只能匹配长度-- 的帖子,但不是很懂,想问一下我这么写为什么不对:
匹配到某个结点 t 上,设当前匹配串最后一次出现位置为 x,则当 x−t+1≤len[fail[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;
}