https://www.luogu.com.cn/problem/P3804
- fail:当前区间-1(最短串 去掉最前面 的字符)

- nxt:任意串 加上最后面

考虑新加入的字符为x,上一个为p,则 n x t [ p ] [ x ] = c nxt[p][x]=c nxt[p][x]=c
当前的每个后缀如果本身nxt为空,都可以加x

代码:

然后考虑现在这样:

如果整个区间可以直接接x

则fail可以直接连过来:

就是这样子写:

但也有可能是这样:

我们考虑把其化为两个区间,另一个记为cq:

首先此时u的fail就可以连到cq了:

q的fail同理:

也就是:

然后考虑原先的大fail:

显然,连回q:

如果是本身连出去的:
同理
可得:

代码表示:

下一个处理nxt:

一样,变成了分别的nxt:

也就是:

另一个,本身连向此的nxt(这里 指的是p中的):

就变到了cq:

也就是:

完整代码:




















