题目传送门
分析:
前缀的公共后缀,那直接SAM安排上
两个前缀的公共后缀为两个串对应Parent树上节点的LCA
于是\([l,r]\)之间的公共后缀最长对应这些点两两在Parent树上LCA的最大的len
Set启发式合并做法:
建出了Parent树,我们考虑每一个点\(u\),合并它的子树集合时,两个集合中各取一个点的LCA一定是\(u\)
我们可以找到若干对点ID相近且LCA为\(u\),他们会对答案造成贡献,而每次合并点集,产生的对数为较小的集合的大小
使用启发式合并,空间复杂度是\(O(nlogn)\),时间复杂度\(O(nlog^{2}n)\)
点对预处理出来之后,可以离线+树状数组查询答案
代码可以看yyb这篇博客,很好理解
LCT+树状数组做法:
我们将询问按\(r\)离线,每次按顺序加入一个点\(i\)时,我们将这个点到根的路径全部染成颜色\(i\),而某个点\(u\)原来的颜色\(j\)被覆盖,那么\(u\)就是\(i,j\)的LCA
每个点的颜色都是最近被覆盖的,得到的点对与上面Set做法得到的点对是一样的
到根路径染色实际上是LCT的access过程,于是直接用LCT维护,过程中即可更新树状数组求答案
时间复杂度\(O(nlog^{2}n)\)
代码是第二种做法的:
#include
#include
#include
#include
#include
#include
#include