当前位置: 首页 > news >正文

Luogu P11361 [NOIP2024] 编辑字符串 题解

Link。

观察题。一个有趣的事实是题解中提到的所有错解我还真都想过一次,比如贪心 pick 最长的连续 \(1\) 段以及尝试合并上下连续的 \(1\) 段。这题的数据范围和特殊性质做的不错,顺着来想比较好考虑问题。

对于 \(\rm A\) 情况,\(s_1\) 所有字符都相同,那么答案是一定的;对于 \(t_1 = t_2\) 的情况,由于限制是一定的,这启发我们在一定位置做了移动的限制下,由于不限制移动次数,我们理论上可以将所有连续的不被限制的数任意排出想要的顺序,所以对于 \(\rm B\) 去看自由移动段的 \(0/1\) 匹配个数之和就是答案;对于 \(|t_{1, i} = 0| = |t_{2, i} = 0| = 1\) 的情况是用来让我们毙掉一些假贪心的,比如 edit_2 里的第二组样例,这个性质 \(\rm C\) 提示我们按照 \(0\) 的位置来 split 开序列形如 \([1, p_0) [p_0, p_0], (p_0, n]\)。然后根据 \(\rm B\) 中我们观察到的结论,“连续段中可以任意排列出想要的 \(01\) 串”,我们对于每个位置贪心地去交换做匹配。

具体地,对于正解:由于连续的 \(1\) 可以任意排列,将连续的 \(1\) 串并为一个区间。考虑怎么贪心地匹配获得最大收益,记 \(c1_{i, 0}, c1_{i, 1}, c2_{i, 0}, c2_{i, 1}\) 分别表示对于串 \(s_1, s_2\) 中连续区间的 \(0/1\)\(cnt\),枚举配对串 \(1 \to n\),分类讨论:

  1. 如果 \(t_{1, i} = t_{2, i} = 0\),那么直接检查 \(s_{1, i}\) 是否等于 \(s_{2, i}\) 即可
  2. 如果 \(t_{1, i} = 0, t_{2, i} \neq 0\),检查是否存在 \(c2_{loc(i), s_{1, i}} \gt 0\) 然后更新答案和 \(c2\)
  3. 如果 \(t_{2, i} = 0, t_{1, i} \neq 0\),同上类似地去检查 \(c1\) 并更新
  4. 如果 \(t_{1, i} = t_{2, i} = 1\),也就是都没有限制,我们直接用 之前已经配对固定位置之后 剩下来的 \(0/1\) 个数各自 \(- 1\) 更新。
#include <bits/stdc++.h>using i64 = long long;void solve() {int n;std::cin >> n;std::string s1, s2, t1, t2;std::cin >> s1 >> s2 >> t1 >> t2;s1 = "$" + s1, s2 = "$" + s2;t1 = "$" + t1, t2 = "$" + t2;std::vector<std::vector<int>> cnt1(n + 2, std::vector<int>(2)),cnt2(n + 2, std::vector<int>(2));std::vector<int> to1(n + 1), to2(n + 1);int o = 0;for (int i = 1; i <= n; i++) {if (t1[i] != t1[i - 1])to1[i] = ++o;elseto1[i] = to1[i - 1];cnt1[to1[i]][s1[i] - '0']++;}o = 0;for (int i = 1; i <= n; i++) {if (t2[i] != t2[i - 1])to2[i] = ++o;elseto2[i] = to2[i - 1];cnt2[to2[i]][s2[i] - '0']++;}int ans = 0;for (int i = 1; i <= n; i++) {if (t1[i] == '0' && t2[i] == '0') {if (s1[i] == s2[i])ans++;} else if (t1[i] == '0') {if (cnt2[to2[i]][s1[i] - '0']) {cnt2[to2[i]][s1[i] - '0']--;ans++;}} else if (t2[i] == '0') {if (cnt1[to1[i]][s2[i] - '0']) {cnt1[to1[i]][s2[i] - '0']--;ans++;}}}for (int i = 1; i <= n; i++) {if (t1[i] == '1' && t2[i] == '1') {if (cnt1[to1[i]][0] && cnt2[to2[i]][0]) {cnt1[to1[i]][0]--;cnt2[to2[i]][0]--;ans++; continue;}if (cnt1[to1[i]][1] && cnt2[to2[i]][1]) {cnt1[to1[i]][1]--;cnt2[to2[i]][1]--;ans++;}}}std::cout << ans << "\n";
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t;std::cin >> t;while (t--) {solve();}return 0;
}
http://www.gsyq.cn/news/39740.html

相关文章:

  • 2025年变电站接地线定做厂家权威推荐榜单:便携型接地线/单簧卡口接地线/电厂专用接地线源头厂家精选
  • 2025年钢管总成加工厂权威推荐榜单:液压钢管总成/硬管总成品牌/免焊接钢管总成源头厂家精选
  • 关于Dify工作流的项目实现与思考
  • 2025年河北搬家渠道权威推荐榜单:河北单位搬迁/河北搬运小时工/河北大型设备搬运服务精选
  • 2025年顶尖候车亭/公交站台//电子站牌/公交站牌/公交候车厅厂家: 江苏兰太城市科技领跑
  • 华为高斯Gauss数据库版本与兼容协议--详解(附带Gorm连接示例代码) - 教程
  • 2025年酒店剃须刀生产厂家权威推荐榜单:一次性剃须刀套装/女士刮毛刀/刮胡刀供应商精选
  • 打开word或PDF,在同目录下自动生成debug.log文件,文件大小0字节!最后发现竟然是一个时时刻刻都要用到的软件引起的
  • 2025年不锈钢门定制工厂排名,不锈钢酒柜定制公司推荐
  • 1000UserGuide:独立开发者获取前1000个用户的终极指南
  • 2025 年仿石漆厂家最新推荐品牌排行榜 —— 涵盖真石漆、水包砂、冠晶石等品类,权威剖析前沿品牌核心竞争力
  • 都昌电子病历编辑器最新特性
  • C/C++跳动的爱心③ - 详解
  • 2025年东北地区电气自动化公司排名,东宇电气市场口碑与产品质量全解析
  • 2025年11月空气能厂家推荐榜:五家优质企业横向对比与深度解析
  • 2025年11月止痒控油洗发水推荐对比:权威评测与用户口碑排行
  • 2025年黑胶唱机制造企业权威推荐榜单:黑胶唱机选购/顶级黑胶唱机/黑胶唱机推荐源头厂家精选
  • [python刷题记录]-盛最多水的容器-双指针-中等
  • 6-7 内部类(Lambda表达式)
  • 告别重复劳动!AIGC与智能体工作流公开课:解锁企业「降本增效」的终极密码
  • 2025年11月超声波清洗机厂家专业评测排名:基于性能与服务能力的客观评价
  • 2025年11月中国电缆品牌评价榜:基于真实数据与用户反馈的全面分析
  • 这门技术太炸了!精通Coze工作流,我成了公司里的“稀缺人才”
  • 2025 年 11 月旋转制粒机厂家推荐排行榜,定制旋转制粒机,实验室旋转制粒机,干法旋转制粒机,湿法旋转制粒机公司推荐
  • 论文学习——用于隐私保护个性化的联邦图神经网络框架
  • 工程石材厂家排行2025:成都优质工厂榜单
  • 成都华洪圣达电气设备有限公司领衔竖井桥架厂家排行
  • 2025年竖井桥架公司推荐排行榜:成都华洪圣达电气设备有限公司领衔
  • 2025年改性pp阻燃母料订购源头厂家权威推荐榜单:丽水pp阻燃改性/pp的阻燃改性/阻燃改性PP源头厂家精选
  • 【CSP-S 2025】社团招新 题解分析