后缀自动机SAM

本文搬运自本人高中时期CSDN博客,若图片加载不出来,可到原文查看:https://blog.csdn.net/zhangtingxiqwq/article/details/132560666

https://www.luogu.com.cn/problem/P3804

  • fail:当前区间-1(最短串 去掉最前面 的字符)

在这里插入图片描述

  • nxt:任意串 加上最后面

在这里插入图片描述

考虑新加入的字符为x,上一个为p,则 nxt[p][x]=cnxt[p][x]=c

当前的每个后缀如果本身nxt为空,都可以加x

在这里插入图片描述

代码:
在这里插入图片描述

然后考虑现在这样:
在这里插入图片描述

如果整个区间可以直接接x
在这里插入图片描述

则fail可以直接连过来:
在这里插入图片描述

就是这样子写:
在这里插入图片描述

但也有可能是这样:
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

q的fail同理:
在这里插入图片描述

也就是:
在这里插入图片描述

然后考虑原先的大fail:
在这里插入图片描述

显然,连回q:
在这里插入图片描述

如果是本身连出去的:
在这里插入图片描述

同理

可得:

在这里插入图片描述

代码表示:

在这里插入图片描述

下一个处理nxt:
在这里插入图片描述

一样,变成了分别的nxt:
在这里插入图片描述

也就是:
在这里插入图片描述

另一个,本身连向此的nxt(这里 指的是p中的):
在这里插入图片描述

就变到了cq:
在这里插入图片描述

也就是:
在这里插入图片描述

完整代码:

在这里插入图片描述