H7.1.4.2. 重复旋律

Statement

给若干串,字符集为 \(0\sim9\),这些串中每个本质不同的子串给答案贡献他代表的整数这么多,求答案模 \(10^9+7\)

Solution

建广义 SAM,对于一个等价类 \(u\),记录一个包含该等价类的串的编号,并记录任意一个 \(\text{endpos}\) 位置,这可以在 BFS 过程中处理

预处理(以下过程均在模 \(10^9+7\) 意义下):

  • \(10\) 的整数次幂

对于每个串的每个位置 \(i\) 预处理:

  • 前缀 \(i\) 代表的整数
  • 该串所有右端点为 \(i\) 的子串代表的整数的和

于是就可以计算每个等价类的贡献,于是做完了,时间线性.


或者这样:

建广义 SAM,变成了简单图论题

\(f(i)\) 表示 \(0\to i\) 的数字总和,\(f(0)=0\)

\[ f(i)=\sum_{\text{nxt}(u,c)=i}\left\{10\cdot f(u)+(\text{len}(u)-\text{len}(\text{link}(u))\cdot c)\right\} \]

\[ Ans=\sum_{i}f(i) \]


或者这样:

拼起来后缀排序,设分隔符为 $,设 \(a_i=i+\text{height}(\text{rk}(i)),b_i\)\(i\) 后继第一个 $ 的前一位

\(f(l,r)\) 为区间 \([l..r]\) 子串代表的数,这个可以 \(O(1)\)

则后缀 \(i\) 的答案为 \(\sum_{j\in[a_i..b_i]}f(i,j)\)

稍微化一下就可以 \(O(n)\) 算了。

posted @ 2024-09-22 21:33  Laijinyi  阅读(10)  评论(0编辑  收藏  举报