视频加载失败

安吉D15 A

662 字
3 分钟
安吉D15 A
原题呈现

P9753 消消乐#

题目描述#

小 L 现在在玩一个低配版本的消消乐,该版本的游戏是一维的,一次也只能消除两个相邻的元素.

现在,他有一个长度为 nn 且仅由小写字母构成的字符串.我们称一个字符串是可消除的,当且仅当可以对这个字符串进行若干次操作,使之成为一个空字符串.

其中每次操作可以从字符串中删除两个相邻的相同字符,操作后剩余字符串会拼接在一起.

小 L 想知道,这个字符串的所有非空连续子串中,有多少个是可消除的.

输入格式#

输入的第一行包含一个正整数 nn,表示字符串的长度.

输入的第二行包含一个长度为 nn 且仅由小写字母构成的字符串,表示题目中询问的字符串.

输出格式#

输出一行包含一个整数,表示题目询问的答案.

输入输出样例 #1#

输入 #1#

8
accabccb

输出 #1#

5

说明/提示#

【样例 1 解释】

一共有 55 个可消除的连续子串,分别是 ccaccaccbccbaccabccb

【数据范围】

对于所有测试数据有:1n2×1061 \le n \le 2 \times 10^6,且询问的字符串仅由小写字母构成.

测试点nn\leq特殊性质
151\sim 51010
676\sim 7800800
8108\sim 1080008000
111211\sim 122×1052\times 10^5A
131413\sim 142×1052\times 10^5B
151715\sim 172×1052\times 10^5
182018\sim 202×1062\times 10^6

特殊性质 A:字符串中的每个字符独立等概率地从字符集中选择.

特殊性质 B:字符串仅由 ab 构成.

此题和括号树惊人的相似.

采用和括号树类似的 dp 状态定义:dp[i] 表示以第 ii 个字符结尾能够构成的合法子串数量.

考虑一下如何转移.

首先,不难发现,若 stri=stri1str_{i} = str_{i-1},即相邻两个位置拥有同样的字符,dpidp_i 就可以由 dpi2dp_{i-2} 转移而来,即以第 i2i-2 个字符结尾的每一个字符串都可以加上 i1,ii-1,i,从而形成一个新的合法串,而 [i1,i][i-1,i] 自身又是一个合法串.转移式为:dpi=dpi2+1dp_i = dp_{i-2} + 1

但是 stristri1str_i\neq str_{i-1} 怎么办呢?想一想,如果两个不相等的字符拼在了一起,并且前一个和 stristr_i 相同的字符是 strjstr_j.那么唯一可以让 stristr_i 被消除的方法就是让 [j+1,i1][j+1, i-1] 之间的所有字符都被消除。不妨定义 preipre_i 表示满足以下条件的下标:

  • stri=strpreistr_i=str_{pre_i}
  • [prei+1,i1][pre_i+1, i-1] 可被消除。

dpidp_i 可以尝试从 dppreidp_{pre_i} 转移

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

安吉D15 A
https://blog.jerrylab.top/posts/problem/anji2026/D15/A/
作者
Jerry
发布于
2026-08-17
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Jerry
Hello, I'm Jerry.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
最新动态
站点统计
文章
80
分类
3
标签
35
总字数
89,198
运行时长
0
最后活动
0 天前
站点信息
构建平台
Cloudflare Pages
博客版本
Firefly v6.16.5
文章许可
CC BY-NC-SA 4.0