计数 DP

箱根驿传

箱根驿传接力赛跑的路程有 段,有 个接力点。有 个队伍参加,没有两个队伍同时到达终点或同时到达同一个接力点。

已知每个队伍到达终点的用时排名,和此排名相比于到达最后一个接力点的用时排名的变化情况(上升,下降,不变)。

按照队伍最终排名从高到低的顺序给出每个队伍的排名变化情况,求到达最后一个接力点的用时排名有多少种可能,模 。

:考虑前 名到达终点的队伍,其中有 个队伍在上一个接力点也在前 名中。

消消乐

我们称一个字符串是可消除的,如果可对它进行下述操作若干次,使它成为一个空串:

  • 删除字符串中某两个相邻且相同的字符,把剩余字符拼接在一起。

给你一个长为 的由小写字母构成的字符串 ,求 有多少个非空子串是可消除的。

称字符串 可分解,若存在可消除的非空字符串 使得 。

设 是非空字符串。若 可消除且 可消除,那么 可消除。

我们尝试对可消除序列进行分解。

若序列 都是可消除的,那么 也是可消除的, 表示序列的拼接。

反过来,如果 是可消除的, 是可消除的,那么 也是可消除的。

于是我们可以把一个可消除序列分解成若干不可分解的可消除序列。

例如 accabccb = acca + bccb。

对于一个序列 ,我们考虑它的最短可消除后缀。
我们找到一个最大的正整数 满足 且 是可消除的。
如果这样的 的存在,那么就用下标 来表示 的最短可消除后缀。

例如

  • (1, 2, 3, 3, 2) 的最短可消除后缀是 (2, 3, 3, 2),我们用下标 来表示。
  • (1, 0, 0, 1, 0) 没有可消除后缀。

对于 的每个前缀 ,我们计算它有多少个可消除后缀,记作 。
那么答案就是 。

如果 的最短可消除后缀是 ,那么 。
若 没有可消除后缀,那么 。

现在的问题是如何找出 的最短可消除后缀(的起始位置)。

如果 那么 的最短可消除后缀是 。
否则 的最短可消除后缀就是满足下列条件的最大下标

  • 可消除

为此,我们计算一个位置,,表示满足下列条件的最大整数

  • 可消除。

现在来考虑如何计算 。
假设 的最短可消除后缀是 。

若 没有可消除后缀, 就不存在。

如果 ,那么 ,

否则 。