【题解】P6292 区间本质不同子串个数

发布时间 2023-04-18 15:16:33作者: flywatre

原题链接


区间本质不同子串个数

题目描述

给定一个长度为 \(n\) 的字符串 \(S\)\(m\) 次询问由 \(S\) 的第 \(L\) 到第 \(R\) 个字符组成的字符串包含多少个本质不同的子串。

定义两个字符串 \(a,b\) 相同当且仅当 \(|a|=|b|\) 并且对于 \(i\in[1,|a|]\) 都有 \(a_i=b_i\)

输入格式

第一行一个长度为 \(n\) 的字符串 \(S\)

第二行一个整数 \(m\),表示询问次数。

接下来 \(m\) 行,第 \(i\) 行包含两个整数 \(l_i,r_i\),描述第 \(i\) 次询问。

输出格式

\(m\) 行,每行一个整数,表示第 \(i\) 次询问的答案。

题解

看到这种离线且动态不太好做的区间信息可以想到扫描线,对于一个串,它会在最大的endpos值改变的时候将贡献的位置向后移动。
考虑加入一个字符后移动的串有哪些,在SAM上即为link树上当前点到根的所有子串。
于是我们需要维护SAM的link树,支持链修改。
用树剖是可做的,但是LCT做有非常好的性质,即一个splay中的串一定是同时改变的。
于是LCT维护一下,在开棵线段树维护一下答案(区间加等差数列)。