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

题解:洛谷 P11361 [NOIP2024] 编辑字符串

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

洛谷:P11361 [NOIP2024] 编辑字符串 - 洛谷

【题目描述】

小 M 有两个长度为n nn且字符集为{ 0 , 1 } \{0, 1\}{0,1}的字符串s 1 , s 2 s_1, s_2s1,s2

小 M 希望两个字符串中对应位置字符相同的出现次数尽可能多,即满足s 1 , i = s 2 , i s_{1,i} = s_{2,i}s1,i=s2,ii ( 1 ≤ i ≤ n ) i(1 \leq i \leq n)i(1in)尽可能多。为此小 M 有一个字符串编辑工具,这个工具提供的基本操作是在一个字符串中交换两个相邻的字符。为了保持字符串的可辨识性,规定两个字符串中的部分字符不能参与交换。小 M 可以用工具对s 1 s_1s1s 2 s_2s2进行多次字符交换,其中可以参与交换的字符能够交换任意多次。

现在小 M 想知道,在使用编辑工具后,两个字符串中对应位置字符相同的出现次数最多能有多少。

【输入】

本题包含多组测试数据。

输入的第一行包含一个整数T TT,表示测试数据的组数。

接下来包含T TT组数据,每组数据的格式如下:

  • 第一行包含一个整数n nn,表示字符串长度。
  • 第二行包含一个长度为n nn且字符集为{ 0 , 1 } \{0, 1\}{0,1}的字符串s 1 s_1s1
  • 第三行包含一个长度为n nn且字符集为{ 0 , 1 } \{0, 1\}{0,1}的字符串s 2 s_2s2
  • 第四行包含一个长度为n nn且字符集为{ 0 , 1 } \{0, 1\}{0,1}的字符串t 1 t_1t1,其中t 1 , i t_{1,i}t1,i1 11表示s 1 , i s_{1,i}s1,i可以参与交换,t 1 , i t_{1,i}t1,i0 00表示s 1 , i s_{1,i}s1,i不可以参与交换。
  • 第五行包含一个长度为n nn且字符集为{ 0 , 1 } \{0, 1\}{0,1}的字符串t 2 t_2t2,其中t 2 , i t_{2,i}t2,i1 11表示s 2 , i s_{2,i}s2,i可以参与交换,t 2 , i t_{2,i}t2,i0 00表示s 2 , i s_{2,i}s2,i不可以参与交换。

【输出】

对于每组测试数据输出一行,包含一个整数,表示对应的答案。

【输入样例】

1 6 011101 111010 111010 101101

【输出样例】

4

【解题思路】

【算法标签】

#提高+# #贪心#

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;constintN=100005;// s1, s2: 原始字符串(从下标1开始)// s3, s4: 分隔符字符串,用于判断是否属于同一组chars1[N],s2[N],s3[N],s4[N];// n1[i][0/1]: 第一组字符串中,第i段的'0'和'1'的数量// n2[i][0/1]: 第二组字符串中,第i段的'0'和'1'的数量intn1[N][2],n2[N][2];// pos1[i]: 原始字符串s1中第i个字符属于第一段中的哪一段// pos2[i]: 原始字符串s2中第i个字符属于第二段中的哪一段intpos1[N],pos2[N];intt;// 测试用例数量intmain(){cin>>t;// 输入测试用例数量while(t--){// 初始化计数数组memset(n1,0,sizeof(n1));memset(n2,0,sizeof(n2));intn;intans=0;// 记录能够匹配的字符对数// 输入n和四个字符串(均从下标1开始存储)cin>>n>>s1+1>>s2+1>>s3+1>>s4+1;intid1=0;// 第一组的分段编号intid2=0;// 第二组的分段编号charlst='0';// 上一个分隔符字符// 处理第一组字符串 s1 和 s3for(inti=1;i<=n;i++){// 如果前一个分隔符是'0'或者当前分隔符是'0',开启新的一段if(lst=='0'||s3[i]=='0'){id1++;}pos1[i]=id1;// 记录当前字符所属段号// 统计当前段的字符数量if(s1[i]=='0'){n1[id1][0]++;}else{n1[id1][1]++;}lst=s3[i];// 更新上一个分隔符}lst='0';// 重置分隔符// 处理第二组字符串 s2 和 s4for(inti=1;i<=n;i++){// 如果前一个分隔符是'0'或者当前分隔符是'0',开启新的一段if(lst=='0'||s4[i]=='0'){id2++;}pos2[i]=id2;// 记录当前字符所属段号// 统计当前段的字符数量if(s2[i]=='0'){n2[id2][0]++;}else{n2[id2][1]++;}lst=s4[i];// 更新上一个分隔符}// 遍历每一个位置,进行匹配for(inti=1;i<=n;i++){// 尝试匹配 '0'if(n1[pos1[i]][0]&&n2[pos2[i]][0]){n1[pos1[i]][0]--;// 消耗一个'0'n2[pos2[i]][0]--;// 消耗一个'0'ans++;// 匹配对数加1}// 尝试匹配 '1'elseif(n1[pos1[i]][1]&&n2[pos2[i]][1]){n1[pos1[i]][1]--;// 消耗一个'1'n2[pos2[i]][1]--;// 消耗一个'1'ans++;// 匹配对数加1}}// 输出当前测试用例的结果cout<<ans<<endl;}return0;}

【运行结果】

1 6 011101 111010 111010 101101 4
http://www.jsqmd.com/news/687694/

相关文章:

  • 如何轻松下载国内七大视频平台内容:Video-Downloader完整指南
  • 2026高低温箱品牌参考:注重售后的厂家与用户口碑汇总 - 品牌推荐大师1
  • 兼职酬劳自动结算程序,按完成任务,触发智能合约,无需中介审核,完成即转账,解决拖欠工资,克扣佣金。
  • 从灾害预警到智慧农业:拆解GeoAI在4大行业的真实落地案例
  • Golang怎么读取环境变量_Golang如何用os.Getenv获取系统环境变量【基础】
  • ChanlunX缠论插件:3步实现专业级技术分析的终极指南 [特殊字符]
  • 官方认证!成都展厅设计公司信誉度排行榜第一名:成都汉诺会展服务有限公司 - 速递信息
  • 2026年分析镀锌止水钢板认证供应商,哪家值得选 - 工业品牌热点
  • 永辉超市购物卡回收注意事项:选择安全渠道更安心 - 团团收购物卡回收
  • 如何快速解决Windows热键冲突:Hotkey Detective智能检测工具完全指南
  • 附录B:SVM 中的迁移策略:核心机制与性能优化
  • 2026年客服平台全面测评,各类型客服推荐选型优劣全解析 - 品牌2026
  • 终极指南:如何为FastAPI/Starlette快速搭建专业SQLAlchemy管理后台
  • httpstat JSON输出模式终极指南:如何将网络性能数据集成到监控系统中
  • 从仿真翻车到丝滑运行:手把手教你用URDF给机器人模型调‘物理参数’(含惯性矩阵避坑指南)
  • 2026宝华空气压缩机选型指南:型号推荐及选购攻略 - 博客湾
  • XSS绕过实战:当HttpOnly锁住Cookie后,我们还能做什么?
  • 别只背课文了!用《新概念英语三》Lesson 6-10练口语和写作的3个实操方法
  • UnityExplorer终极指南:如何在运行时调试和修改Unity游戏
  • 免费开源桌面分区神器:NoFences让Windows桌面焕然一新的终极方案
  • 别再硬写Prompt了!用LangChain的ChatPromptTemplate和Feast,5分钟搞定个性化AI客服
  • 如何用WinUtil:一键解决Windows系统管理的终极指南
  • VMware虚拟机+Ubuntu 22.04 LTS:从零搭建ROS2 Humble开发环境的保姆级避坑指南
  • 福州美容机构如何筛选?正规资质与安心变美指南 - 品牌2026
  • 2026年昆山托盘厂家最新排名榜单/二手塑料托盘,二手川字托盘,二手川字平板托盘,二手田子塑料托盘,二手田字平板塑料托盘 - 品牌策略师
  • 终极指南:破解Keras模型持久化难题——激活层序列化机制深度解析
  • Real-ESRGAN-GUI:让低分辨率图片焕发新生的一站式AI图像增强工具
  • Real Anime Z入门指南:无需Python基础,Streamlit界面全图形化操作
  • 秒懂京东e卡回收流程 - 团团收购物卡回收
  • 攀枝花好用的镀锌止水钢板多少钱,性价比高的有哪些? - 工业推荐榜