经典题。

讲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++,区间加,单点查询。

 

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

 

相关文章:

  • 2021-12-05
  • 2021-10-11
  • 2021-11-29
  • 2021-09-05
  • 2021-12-24
猜你喜欢
  • 2021-06-28
  • 2022-01-21
  • 2021-12-16
  • 2021-09-03
  • 2021-12-07
  • 2021-04-14
  • 2022-02-05
相关资源
相似解决方案