zoukankan      html  css  js  c++  java
  • CF1574F Occurrences

    考虑什么样的串是合法的。

    直接考虑比较抽象,考虑具象化这个问题。

    容易发现一个字符串的限制就相当于如果出现了其中一个字符 (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))

    GO!
  • 相关阅读:
    14 循环结构
    12.Maps
    11 Lists
    10 正则表达式
    8 Operator overloading
    9 Strings
    7 数据类型
    6 GPath
    4 练习: 使用eclipse开发
    5 类、对象、方法
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15361322.html
Copyright © 2011-2022 走看看