类似SA一样,在串之间加上特殊字符,这里用数字10就行了,建立SAM。
然后对SAM进行拓扑一次,从前往后统计。
记录到达该节点的路径数量cnt,以前到达该结点的和sum。
则子节点的和则加上,当前节点的和*10+cnt*j,j表示在末尾添加的数字。
拓扑部分,可以用经典的线性,也可以暴力对Len排序。
但是有一些要注意的地方:
1、10是添加的特殊字符,关于10的边是不转移的,这比较显然,只不过是为了不计算重复子串,将所有串拼在一起
2、前导0是要忽略的,也就是从root转移的时候,不能走0,不然会重复计算
[cpp]
#include
#include
#include
#include
#include
#include