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++,区间加,单点查询。
树上后缀排序大放异彩~~