发布时间:2026/9/6 3:23:56
P1071 [NOIP 2009 提高组] 潜伏者 记录156#includebits/stdc.h using namespace std; int main() { // 优化IO速度 ios::sync_with_stdio(false); cin.tie(0); string s1,s2,s3; cins1s2s3; // 1. 定义两个 map // decode_map[密文字符] 明文字符 mapchar,char decode_map; // used_map[明文字符] true (用来检查明文是否被占用) mapchar,bool used_map; int len1s1.size(); int cnt0; // 记录成功映射的字母个数 // 2. 如果长度小于26直接判负 if(len126) { coutFailed; return 0; } // 3. 遍历样本建立映射 for(int i0;ilen1;i) { char enc_chars1[i]; // 当前密文字符 char plain_chars2[i]; // 当前明文字符 // 检查这个密文字符之前是否出现过count(key) 用于查找某个键Key在容器中是否存在。 if(decode_map.count(enc_char)) { // 出现过检查它对应的明文是否和现在的一致 if(decode_map[enc_char]!plain_char) { coutFailed; return 0; } } else { // 密文第一次出现准备建立映射。先检查明文是否被占用了 if(used_map[plain_char]) { coutFailed; return 0; } // 双向绑定成功 decode_map[enc_char]plain_char; used_map[plain_char]true; cnt; } } // 4. 检查是否凑齐了26个字母 if(cnt26) { coutFailed; } else { // 5. 翻译目标密文 for(int i0;is3.size();i) { // 直接从 map 中取出对应的明文 coutdecode_map[s3[i]]; } } return 0; }题目传送门https://www.luogu.com.cn/problem/P1071前言我是一名专注信奥赛CSP-J/S、NOIP的教练。如果你觉得这篇题解对你有帮助欢迎点击关注我的CSDN账号我会持续更新高质量算法解析。我深知算法思维的构建远比单纯通过题目更重要本系列题解不局限于AC代码的堆砌而是致力于拆解题目背后的逻辑链条与核心知识点备赛路上若遇瓶颈欢迎随时评论或私信我将甄选典型疑难问题通过视频讲解或撰写专项文章的形式为你提供深度答疑。核心解题思路这道题是一道非常经典的字符串处理与哈希映射Map问题。问题转化双向映射机制题目要求我们根据已知的“密文”和“明文”样本推导出密码本。这本质上是一个双向映射问题密文 →→ 明文一个密文字符只能对应一个明文字符。明文 →→ 密文一个明文字符也只能被一个密文字符对应即不同的字母对应不同的密字。算法设计状态检查与翻译在遍历样本建立密码本的过程中我们需要时刻检查是否违反了上述两个规则。如果违反或者样本中未能覆盖 A~Z 所有的 26 个字母则直接判定为Failed。只有当密码本完美建立后我们才能利用这个密码本去翻译目标密文。代码分块详细解释1. 头文件、输入处理与前置检查#includebits/stdc.h using namespace std; int main() { // 优化IO速度 ios::sync_with_stdio(false); cin.tie(0); string s1, s2, s3; cin s1 s2 s3; // 1. 定义两个 map // decode_map[密文字符] 明文字符 mapchar, char decode_map; // used_map[明文字符] true (用来检查明文是否被占用) mapchar, bool used_map; int len1 s1.size(); int cnt 0; // 记录成功映射的字母个数 // 2. 如果长度小于26直接判负 if(len1 26) { cout Failed; return 0; }详细分析数据结构选择使用两个map容器是本题的核心。decode_map用于记录从密文到明文的翻译规则used_map作为一个标记数组记录哪些明文字母已经被“占用”。前置剪枝由于题目要求 A~Z 共 26 个字母必须全部出现才能破译成功如果样本字符串的长度小于 26绝对不可能凑齐 26 个字母因此直接输出Failed并结束程序。这避免了不必要的遍历。2. 核心逻辑遍历样本与双向绑定检查// 3. 遍历样本建立映射 for(int i 0; i len1; i) { char enc_char s1[i]; // 当前密文字符 char plain_char s2[i]; // 当前明文字符 // 检查这个密文字符之前是否出现过count(key) 用于查找某个键Key在容器中是否存在。 if(decode_map.count(enc_char)) { // 出现过检查它对应的明文是否和现在的一致 if(decode_map[enc_char] ! plain_char) { cout Failed; return 0; } } else { // 密文第一次出现准备建立映射。先检查明文是否被占用了 if(used_map[plain_char]) { cout Failed; return 0; } // 双向绑定成功 decode_map[enc_char] plain_char; used_map[plain_char] true; cnt; } }详细分析这是代码的灵魂完美处理了题目中的“自相矛盾”情况。密文一致性检查如果enc_char已经在decode_map中说明之前已经为它分配过明文。此时必须检查之前分配的明文是否等于当前的plain_char。如果不等说明同一个密文对应了多个明文违反规则直接Failed。明文唯一性检查如果enc_char是第一次出现准备建立映射前必须先检查plain_char是否已经在used_map中被标记为true。如果是说明这个明文已经被其他密文“抢走”了违反了“不同的字母对应不同的密字”规则同样直接Failed。成功绑定只有当上述两个检查都通过时才将映射关系写入decode_map标记plain_char为已占用并将成功映射的计数器cnt加 1。3. 结果判定与目标密文翻译// 4. 检查是否凑齐了26个字母 if(cnt 26) { cout Failed; } else { // 5. 翻译目标密文 for(int i 0; i s3.size(); i) { // 直接从 map 中取出对应的明文 cout decode_map[s3[i]]; } } return 0; }详细分析完整性检查遍历结束后检查cnt是否等于 26。如果小于 26说明样本中未能覆盖所有的字母无法破译完整的密码输出Failed。目标翻译如果密码本完美建立cnt 26则遍历目标密文s3。对于s3中的每一个字符直接利用decode_map作为字典进行 O(1)O(1) 级别的查找并输出对应的明文。核心逻辑总结表代码模块核心变量/操作精炼作用解决的痛点前置剪枝if(len1 26)提前判断样本长度是否足够快速排除样本长度不足导致无法覆盖 26 个字母的情况密文映射decode_map[enc_char]记录密文到明文的翻译规则解决“一个密文对应多个明文”的矛盾检查明文占用used_map[plain_char]标记明文是否已被其他密文绑定解决“多个密文对应同一个明文”的矛盾检查完整性检查if(cnt 26)检查成功映射的字母总数确保 A~Z 所有的 26 个字母都获得了相应的密字目标翻译decode_map[s3[i]]利用哈希表进行字符替换在密码本建立后以极高的效率完成目标密文的翻译

相关新闻

2026/8/31 10:22:03

AI模型训练卡顿真相大起底(2024性能分析工具实测报告)

更多请点击: https://kaifayun.com 第一章:AI模型训练卡顿现象的系统性归因 AI模型训练过程中出现的卡顿并非孤立故障,而是多层级资源协同失衡的外在表征。从硬件层到框架层,再到算法与数据流设计,任一环节的隐性瓶颈…

2026/9/6 11:12:34

树莓派Pico串口通信实战:UART原理、MicroPython编程与调试指南

但凡用Pico做过一点点嵌入式开发,串口通信都是绕不开的能力。打印调试日志要串口,接GPS模块要串口,让PC和单片机之间互相对话,最直接的方式还是串口。我最早接触Pico时,以为串口就是两根线把TX和RX一连、收发数据就完事…

2026/9/6 11:12:34

关键击杀与零封背后:电竞战术复盘的系统化拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:12:34

代数不等式证明:利用AM-GM不等式与立方和公式求解a³+b³≥2

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:12:34

MySQL索引原理与优化实战:从B+树到Java应用性能提升

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:07:33

开源扫地机器人方案全解析:从SLAM到路径规划的完整实践

GitHub 上有人把整套扫地机器人的方案开源了,初看标题我第一反应是又一个标题党。扫地机器人这玩意儿,机身里同时塞了电机控制、激光雷达、除尘风机、电池管理,还有一整套建图导航算法,怎么看都不像个人玩家能碰的东西。直到我把仓…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…