一种原因可能是在求每个位置匹配长度的时候,您直接跳了fail,而忽略了每个节点里面包含的每个串。换句话说,可能把串稍微放短一点就可能卡进区间 [l,r][l,r][l,r] 中,而您直接认为这个节点的 所有 串都不能匹配了。
正确的做法是维护一个len,失配就--len而不是直接跳fail,发现 len=len[fail[u]] 的时候再 u=fail[u]
len
--len
fail
len=len[fail[u]]
u=fail[u]