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)\) 算了。