ABC353
不知道为啥有断更了一周...
woc,怎么跟我出的题目这么像
先把字符串扔到一个 Trie 里面,然后对于每一个点我们考虑这一个点到根节点组成的字符串能是多少对字符串的最长公共前缀。
我们定义 \(cnt_u\) 表示共有多少个字符串的结尾在以 \(u\) 为根的子树内。对于 \(u\) 节点,其贡献即为 \(dep \times \sum_{v \in son_u,w \in son_u} cnt_u \times cnt_w\)。然后把每一个点的贡献加起来即可。
坑一下,有时间填。
首先有一个 dp。
\[dp_i = \max^{i - 1}_{j = 0} (dp_j - C \times |t_i - t_j|) + p_i
\]
这个 dp 是显而易见的。然后我们可以把绝对值拆开。
\[$dp_i = \max_{0 \le j < i \text{且} t_j \le t_i} (dp_j + C \times t_j) + p_i - C \times t_i
\]
然后我们只需要一个数据结构来维护前缀 \(\max\) + 单点修改即可。可以使用线段树,树状数组或者 set
。