P9753 [CSP-S 2023] 消消乐

news/2025/9/17 20:16:23/文章来源:https://www.cnblogs.com/wuzihe/p/19097418

前置算法

  1. 动态规划
  2. hash哈希

题目大意

给定一个字符串,可以将相邻两个相同的字符删除,然后合并成一个新序列。

例如:abba,可以先将两个 b 删除,然后合并成 aa,最后删除 a

求出有多少个字串,最后可以将其变为空串,我们称之为合法的字串。

思路

看到数据范围,只能使用 \(O(n)\) 及以下的时间复杂度来解决这道问题。

思考他的性质,显然如果 [a, b][b + 1, c] 是一个合法的字串,则 [a, c]

求解 f[] 数组

考虑动态规划,设 \(f[i]\) 表示以第 \(i\) 个字符为结尾的合法字串有多少个,则 \(f[i] = f[x-1] + 1\),其中 \(x\) 为最大的一个合法区间的左端点。

求解 x[] 数组

可以看到,\(s[x]\) 一定等于 \(s[i]\),并且 [x + 1, i - 1] 一定也是一个合法字串,从而得到 \(x[i] = x[i-1] - 1\),直到 \(s[x[i]] = s[i]\),找不到则等于 \(i\)

优化

可以发现求解 x[] 的过程比较慢,考虑下面一张图,是求解 x[] 的过程图

无标题

因为每次 x[i] 总是回调到 x[i-1] - 1,所以令 t[i-1] = x[i-1] - 1,则每次 x[i] 只要跳到 t[i-1] 即可

有标题

现在可以将他看成几条链,每一条链的编号为链头,用 \(to[i]\) 表示 \(i\) 所在的链的编号即对头是多少,用 \(a[id][c]\) 表示链编号为 \(id\) 的链上,最近的一个字符 \(c\) 的位置,没有则为 \(0\)

这样就可以在 \(O(n)\) 的时间复杂度内解决这道题。

代码

#include <iostream>
using namespace std;const int N = 2000010;
long long n, dp[N], to[N], a[N][40];
string s;int main() {cin >> n >> s;s = " " + s;for (int i = 1; i <= n; i++) {to[i] = i; // 将链头赋值为 iint x = a[to[i-1]][s[i] - 'a' + 1]; // 找到最近的一个合法左端点if (x) to[i] = to[x-1], dp[i] = dp[x-1] + 1; // 更新dp值a[to[i]][s[i] - 'a' + 1] = i; // 更新 a 数组}long long ans = 0; // 不开 long long 见祖宗for (int i = 1; i <= n; i++)ans += dp[i];cout << ans << endl;return 0;
}

完结撒花!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9.16 CSP-S模拟22 改题记录

HZOJ 写在前面 连着两天吃了两坨。。。好吧,那就一坨一坨地消化一下吧。话说如果这真是S组难度那我不真就废了?这场真是T1猜结论题,T2就来坨大的,不知道啥是二分图暴力都不会打。T3反正就是我是大春竹。T4上演忘记结论创造结论,然鹅实际上还是不会写。没有文件输入输,没有…

AT_agc058_b [AGC058B] Adjacent Chmax

转化为对某个区间染色,然后设 \(f_{i, j}\) 为前 \(i\) 种颜色染了 \([1, j]\) 的方案数,简单转移即可。

Jenkins CVE-2018-1000600漏洞利用与SSRF攻击分析

本文详细分析了Jenkins GitHub插件CVE-2018-1000600漏洞的利用方法,通过CSRF漏洞和权限缺失实现凭证窃取与完全响应SSRF攻击,包含PoC代码和影响版本范围说明。Jenkins - CVE-2018-1000600 PoC 来源博客文章 https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with…

NOIP 集训日记(学术)

workwork学术版。 9.9 P4117 [Ynoi2018] 五彩斑斓的世界 分块神题。 拿到题以后发现不能直接做,然后你就开始观察。 设区间最大值为 \(maxn\) ,查询的数为 \(x\) 一个显然的性质:把所有小于等于 \(x\) 的数加上 \(x\) ,然后区间减 \(x\) ,得到的结果不变。然后我们思考一下…

linux中mysql如何远程连接

linux中mysql如何远程连接 两个步骤: 第一:让root允许远程登录 update user set host = % where user = root;第二:给予root用户最大数据库权限 grant all privileges on *.* to root@% identified by 123456; flush privileges;实操: [root@bogon ~]# mysql -uroot -p1234…

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

深入解析:PYcharm——pyqt音乐播放器

深入解析:PYcharm——pyqt音乐播放器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important…

威联通NAS如何导入本地docker镜像

威联通NAS如何导入本地docker镜像 【前言】:有一段时间没有维护NAS docker了,笔记本电脑坏了更换后重新配置开发环境,也就没去折腾这些,有些命令忘记了,重新整理一下,输出驱动输入,还可能帮助到。欢迎大家一起友好讨论, 祝好: 【摘要】:本文主要围绕威联通NAS如何导入…

基本数据类型题目

1、列表的操作可变的数据类型,增删改查等操作都可以进行1、案例1fruits=[苹果, 香蕉, 橙子, 葡萄, 西瓜]向列表中添加两种新水果:菠萝和芒果从列表中删除香蕉元素将列表中的橙子改为柑橘检查葡萄是否在列表中,并返回其索引fruits = [apple, banana, apple, orange, banana, …

2025.9.17

卷2选择 位运算 位运算的优先级很低,没有括号时运算顺序靠后。

mysql库缺失

mysql库缺失libncurses.so.5和libtinfo.so.5 报错信息: mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory;mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared obj…

flask简单路由(视图函数)

简单路由(视图函数) 简单返回html @app.route(/tmp) def tmp_page(): # 函数名为tmp_page,对应url_for(tmp_page)return render_template(tmp.html)@app.route(/Custom_routing) def Custom_routing_page(): return render_template(/Custom_routing/index.html) # Custom…

【学习笔记】拉格朗日插值

EZ、什么是拉格朗日插值? 众所周知,\(n+1\) 个点可以唯一确定一个 \(n\) 次多项式。 拉格朗日插值法要解决的就是给定 \(n+1\) 个点确定一个多项式 \(f(x)\),求出在自变量 \(x=k\) 时多项式的取值。 拉格朗日插值法的思想和 CRT 非常像——把每一个维度独立拆开来。 考虑对一…

一种基于动作指令交互的动态活体检测技术,提升人脸识别安全性

在当今数字化时代,人脸识别技术已广泛应用于金融支付、门禁考勤、手机解锁等关键场景,其便捷性深受用户青睐。然而,随之而来的安全风险也日益凸显:高精度的照片、屏幕翻拍、甚至3D面具等攻击手段层出不穷,令传统的静态人脸识别技术面临严峻挑战。为了构筑更加坚固的安全防…

[系统] Windows 已有office版本和visio不兼容的解决方案

最近IC相关论文想用VISIO来画图,但是遇到了如下痛点:VISIO软件的安装必须与现有Office一致,例如现有word等均为32bit,VISIO也必须使用32bit的安装包; 同为32/64bit安装时报错“Office 16 Click-to-Run Extensibility Component”,这种情况需要输入regedit,打开注册表,依…

CF 2127F Hamed and AghaBalaSar

通过枚举破除限制,贡献拆分,等价思考,容斥怎么拆贡献又把自己拆乱了,我也是完蛋了。 首先考虑这个 \(f(a)\) 是什么。 发现跳(仅限第一个操作)的时候形如 \(x\to nxt(x)\to nxt(nxt(x))\to \cdots\),贡献就为 \((a_{nxt(x)} - a_x) + (a_{nxt(nxt(x))} - a_{nxt(x)})\)。…

AT_agc055_b [AGC055B] ABC Supremacy

一眼为学了 trick 不会用。 这种题考虑钦定代表元两边往中间靠。 你思考一下发现任意一个 \(ABC, BCA, CAB\) 可以在序列里任意乱跑,于是你可以把起始状态和最终状态的这种东西全部提前,我们只需要看剩下的部分是否一样就好。 属于是脑电波题。

“Sequential Thinking MCP Server 和codex等AI工具本身任务拆解功能对比

从你提供的文件内容来看,这个工具是一个名为“Sequential Thinking MCP Server”的工具,它用于通过结构化的思考过程解决问题。以下是对它与Codex或Claude Code CLI本身任务拆解功能的不同之处的分析: 功能定位Sequential Thinking MCP Server:专注于通过动态和反思性的思考…

基于错误xsleak 悬空标记 运用css利用帧计数 -- Pure leak ASIS CTF 2025

基于错误xsleak 悬空标记 运用css利用帧计数 -- Pure leak ASIS CTF 2025pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courie…