学到哪里口胡到哪里
终点等价的含义:两个串终点等价,当且仅当所有她们出现的终点都相同
如:在串babbab中,bab与ab终点等价
后缀链接:v的后缀链接指向这个状态在不同等价类中的最长状态
例如:
对于串 abaabaab
状态aab的后缀链接就是ab
(注意这个链接又称link是从长的状态连向短的状态,即abaab->ab->b)
进而沿着后缀链接迟早能走到空(终点集合为¢或理解为所有集合)
∴后缀链接树树与终点集合树等价
(任意后缀链接树到叶子节点的所有节点后缀最后一位==终点相同)
∴每个状态对应不同长度
还是abaabaab
abaab与aabaab对应相同
∴任意节点开始沿着后缀链接走所经过的所有合法长度构成的∪是一段连续区间且不相交
每次新加入一个节点发生的事件
1.产生一个新节点,考虑last,last没有当前转移就指向她,同时对于所有last的后缀树上父亲指向她;
2.如果link的所有节点都从未有过这个转移,说明这个后缀字串没有更短的后缀状态已经出现(如对于aab而言已经有ab状态出现),其link直接指向0;
3.否则,存储最后一个点为q,由状态p经字符c转移而来;
4.若p状态长度+1就是q长度(如aa->aab),就说明这个转移就是当前状态的上一等价类,直接把当前状态的link指向q;
这里有点不太好理解,比如串aaaaaaab,对于aa而言,它的终点集合是011111110
5.否则,(这个转移所拥有的长度应当是比这个点更长)就生成一个q的复制点状态clone,把q的转移和后缀链接传给她,把当前加入状态及p状态的link均指向这个新点,这个新点的len为lenp+1,同时将所有p的link父亲有指向q的经过字符c的转移指向这个点,更新last为当前点。
6.最后,当前状态的所有link父亲都是结束状态(这些状态都是整个串的后缀)
就是说,当现在所拥有的后缀自动机已经没有适合的能接入当前新状态的时候,我们就强行给这个父亲节点新建一个父亲节点,使这个节点状态符合要求,并且使得这个新状态能够合法加入。
###如何统计字串出现次数:
对于自然状态(非克隆)而言,赋值为1,然后从后向前依次将这个节点的个数加到其link节点上。
###统计出现位置(第一次/所有次数)
对于询问第一次出现而言,生成新节点时记录位置即可,复制时一并搞走;
对于询问所有出现位置而言,记录isclon,对于复制得到的点忽略即可,dfs获得后缀树就完事了。
##利用后缀自动机实现的优美算法:
噫我都不会
##回文自动机
###利用两颗自动机,一个维护奇数回文,一个维护偶数回文
大概就是这样了。