bzoj4231: 回忆树

经典题。

讲4种做法

 

跨越LCA部分全部用KMP处理即可。略过。

问题集中在怎样找到u到根的链上一个串的出现次数。

 

1.离线+AC自动机

离线建AC自动机,匹配,树状数组查fail树子树即可。

log

2.在线+树剖+SAM+线段树合并

树剖,每个重链维护SAM,暴力匹配,线段树合并查询right集合一个出现后缀的size

轻重链切换位置也要KMP

log^2

3.在线+EXSAM+线段树合并

直接把trie变成EXSAM,dfs一下,记录进栈出栈括号序,(类似树上莫队

进入位置++,出去位置--

线段树合并,确定到出现的right集合,查询线段树上dfs序<=dfn1[u]的前缀和

4.在线+树上后缀排序+二分+主席树

树上后缀排序,二分出存在区间(二分左右端点,暴力匹配),括号序(进来+,出去-),主席树查询区间和。

具体:主席树处理的时候,每扫到一个后缀,把进来dfs序位置+1,出去dfs序位置-1。

或者一个后缀,给整个子树val++,区间加,单点查询。

 

树上后缀排序大放异彩~~

 

posted @ 2019-07-03 12:18  *Miracle*  阅读(343)  评论(0编辑  收藏  举报