当前位置: 首页 > 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.jsqmd.com/news/31180/

相关文章:

  • AI辅助编程下的软件分层设计:让生成的代码井然有序
  • 2025年钢管总成加工厂权威推荐榜单:液压钢管总成/硬管总成品牌/免焊接钢管总成源头厂家精选
  • 2025年变电站接地线定做厂家权威推荐榜单:便携型接地线/单簧卡口接地线/电厂专用接地线源头厂家精选
  • 关于Dify工作流的项目实现与思考
  • 2025年河北搬家渠道权威推荐榜单:河北单位搬迁/河北搬运小时工/河北大型设备搬运服务精选
  • 2025年顶尖候车亭/公交站台//电子站牌/公交站牌/公交候车厅厂家: 江苏兰太城市科技领跑
  • 华为高斯Gauss数据库版本与兼容协议--详解(附带Gorm连接示例代码) - 教程
  • 任务栏图标变空白
  • 2025年酒店剃须刀生产厂家权威推荐榜单:一次性剃须刀套装/女士刮毛刀/刮胡刀供应商精选
  • 打开word或PDF,在同目录下自动生成debug.log文件,文件大小0字节!最后发现竟然是一个时时刻刻都要用到的软件引起的
  • 2025年铸铁修正轮企业权威推荐榜单:丸片修正轮/金刚石丸片修正轮/镀砂修正轮源头厂家精选
  • 西南地区钢结构工程设计施工服务TOP5推荐:钢结构工程设计服务商哪个靠谱
  • 2025年防水卷材供应商权威推荐榜单:防水涂料/堵漏材料/外墙防水涂料源头厂家精选
  • 2025年不锈钢门定制工厂排名,不锈钢酒柜定制公司推荐
  • 1000UserGuide:独立开发者获取前1000个用户的终极指南
  • 2025年不锈钢家具定制工厂推荐:5家靠谱专业不锈钢机构全解析
  • 2025年重庆叛逆孩子强制管教学校排行榜推荐
  • 2025 年清污机源头厂家最新推荐榜单权威发布,聚焦耐腐蚀技术与智能清污实力,结合协会测评数据精选品牌回转式格栅/不锈钢清污机公司推荐公司推荐
  • CSP2025 题解
  • 都昌电子病历编辑器最新特性
  • C/C++跳动的爱心③ - 详解
  • 2025年五大靠谱劳动仲裁律师服务公司推荐
  • 2025年电梯装潢开槽机厂商权威推荐榜单:铝单板开槽机/幕墙开槽机/门业开槽机源头厂家精选
  • 【MySQL 从入门到精通:核心知识点与实战优化指南】 - 指南
  • 2025年东北地区电气自动化公司排名,东宇电气市场口碑与产品质量全解析
  • 2025年四通球阀生产厂家权威推荐榜单:不锈钢法兰球阀/低温球阀/不锈钢三通球阀源头厂家精选
  • 2025 年启闭机制造厂家最新推荐:权威测评排名榜单及品牌选择全方位指南固定卷扬启闭机/手电两用螺杆启闭机/电装启闭机公司推荐
  • 2025年财产分割律师事务所权威推荐,财产分割律师哪家好
  • 2025年电缆厂家权威推荐榜单:铜线/三芯/铝芯/感温/矿物质/平方铜/平方铝电缆源头厂家精选
  • 2025年11月空气能厂家推荐榜:五家优质企业横向对比与深度解析