考虑什么样的串是合法的。
直接考虑比较抽象,考虑具象化这个问题。
容易发现一个字符串的限制就相当于如果出现了其中一个字符 (a_i = c),那么 (s) 中 (c) 前 (i - 1) 个字符必然要为:(a_1 sim a_{i - 1}),(c) 后的 (n - i) 个字符必然要为 (a_{i + 1} sim a_n)。
这个限制比较严格,可以放宽为:对于每个在串 (a) 中出现过的字符 (a_i = c),其前面一个字符必为 (a_{i - 1}) 后面一个字符必为 (a_{i + 1})。
此时我们对字符集中的每个字符建点,对于任意的一个串 (a) 我们连边 (forall i in [1, n - 1], a_i o a_{i + 1})。
因此 (s) 可以看作是在这张图上 不断地 选一个入度为 (0) 的点走到一个出度为 (0) 的点的过程。
那么显然要分不同的(弱)连通块考虑,容易发现一个(弱联通块)是可选的当且仅当:
-
所有点的入度和出度均不超过 (2)。
-
不存在环。
因此满足上述两条限制的连通块只能是一条往一个方向的链。
将所有可行的链找出来,问题可以转化为:
有 (n) 种物品,每种物品有长度 (l_i)(满足 (sum l_i = k)),且每个物品有无限个,每次选择一个物品放在序列末端,问构成长度为 (m) 的序列有多少种?
考虑 ( m dp),令 (f_i) 为构成长度为 (i) 的序列的方案数,朴素转移是 (mathcal{O}(nm)) 的。
注意到本质不同的 (l_i) 至多只有 (sqrt{k}) 种,于是可以将这 (sqrt{k}) 种一起转移,复杂度 (mathcal{O}(msqrt{k})),已经可以通过本题。
于此同时,我们将本质不同的 (l) 看作是一种后有:(f = f imes l),因此可以做半在线卷积 / 求逆即可,复杂度 (mathcal{O}(n log ^ 2n) / mathcal{O}(n log n))。