基础知识:
step[i]表示的是字符串i在原字符串中的位置。
Pareint[i]表示root到parent[i]的子串是root到i的最长后缀。
后缀自动机遍历可以得到原字符串的所有子串。
特殊技巧:
一.后缀自动机的不同子串数有两种求法:
1. Ans = step[i]–step[parent[i]] (1<=i<=cnt)
2. Ans[i] = Ans[son[i][1]]+Ans[son[i][2]]+…..(倒序递推才行)。
这两种求法各有千秋,第一种求法方便,但是第二种求法不仅可以求出总的不同的子串数,还可以求出从每个状态s开始有多少不同的子串。(如:诸神眷顾的幻想乡和弦论)。
二.后缀自动机支持构建字符树,即可以知道这棵树上从深度小的点到深度大的点的所有子串(所以说并不仅仅局限于一个字符串!)构建方法就是同一个节点的儿子节点以同一个last进行构建。
三.后缀自动机也支持多串匹配,即可以把多个串都丢到一个自动机上去,我们就可以获得所有串在一起的不同子串个数了。
四.后缀自动机到某个点的所有路径一定都是互相包含的关系。