给定一个长度为 $n$ 的字符串 $S$,令 $T_i$ 表示它从第 $i$ 个字符开始的后缀。求$\sum_{1 \le i \lt j \le n} \text{len}(T_i)+\text{len}(T_j)-2 \times \text{lcp}(T_i,T_j)$。
其中,$len(a)$ 表示字符串 $a$ 的长度,$lcp(a,b)$ 表示字符串 $a$ 和字符串 $b$ 的最长公共前缀。
day7
后缀数组 + 单调栈
思路
不妨把式子拆开来看,首先可以直接算出$\sum_{1 \le i \lt j \le n} \text{len}(T_i)+\text{len}(T_j)$。
显然这个值等于$len(S)(len(S)+1)(len(S)-1)/2$。
那么如何算$\sum_{1 \le i \lt j \le n}\text{lcp}(T_i,T_j)$呢?
只需要算出对于每个后缀$suf_i$,$\sum_{j\lt i} lcp(suf_i,suf_j)$,这个需要用到后缀数组预处理,然后根据height数组的性质,用单调栈维护便可。
代码
1 |
|
后缀自动机
留坑。