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]]利用哈希表进行字符替换在密码本建立后以极高的效率完成目标密文的翻译

相关新闻

鸿蒙 ArkTS 实战:Taxi Fare Estimator 从打车费用估算到出行费用应用完整解析

鸿蒙 ArkTS 实战:Taxi Fare Estimator 从打车费用估算到出行费用应用完整解析

鸿蒙 ArkTS 实战:Taxi Fare Estimator 从打车费用估算到出行费用应用完整解析 前言 打车费用估算 是一个典型的鸿蒙 ArkTS 轻量工具页面。它围绕“根据车型、里程和等待时间估算打车费用,支持快车、专车和豪华三种计价模型。”这个明确需求&#xff0c…

2026/7/22 16:24:35 阅读更多 →
TI PRCM时钟源选择:从寄存器配置到系统级时钟管理实战

TI PRCM时钟源选择:从寄存器配置到系统级时钟管理实战

1. 项目概述:从寄存器手册到系统级时钟设计如果你和我一样,常年泡在嵌入式底层开发里,那对TI(德州仪器)的PRCM模块一定不陌生。手册里那些密密麻麻的寄存器位域描述,像MPU_CLKSRC、VIDEO_PLL_CLKSRC&#x…

2026/7/22 16:23:34 阅读更多 →
DSP硬件设计核心:时序参数与热阻特性深度解析与实战指南

DSP硬件设计核心:时序参数与热阻特性深度解析与实战指南

1. 项目概述:为什么DSP的时序与热阻是硬件设计的“命门”在通信基站、专业音频处理设备或者医疗成像系统里,我们这些硬件工程师选型DSP芯片时,除了看主频、算力、内存这些显性指标,有两个藏在数据手册深处的参数,往往决…

2026/7/22 16:23:34 阅读更多 →

最新新闻

从PubMed到arXiv,AI搜索精准抓取“被引但未列”的关键文献:科研反脆弱性构建的第4范式(独家算法白皮书节选)

从PubMed到arXiv,AI搜索精准抓取“被引但未列”的关键文献:科研反脆弱性构建的第4范式(独家算法白皮书节选)

更多请点击: https://intelliparadigm.com 第一章:从PubMed到arXiv,AI搜索精准抓取“被引但未列”的关键文献:科研反脆弱性构建的第4范式(独家算法白皮书节选) 传统文献检索常陷入“可见性陷阱”&#xff…

2026/7/22 17:11:02 阅读更多 →
【AI视频演示ROI翻倍实战手册】:实测提升平均停留时长317%,附Figma+Runway双平台操作速查表

【AI视频演示ROI翻倍实战手册】:实测提升平均停留时长317%,附Figma+Runway双平台操作速查表

更多请点击: https://intelliparadigm.com 第一章:AI视频产品演示视频的核心价值与ROI验证模型 AI视频产品演示视频已超越传统营销素材的定位,成为技术可信度、用户理解效率与销售转化闭环的关键枢纽。其核心价值体现在三重维度:…

2026/7/22 17:11:02 阅读更多 →
如何使用GraphPipe快速部署TensorFlow模型?3分钟上手教程

如何使用GraphPipe快速部署TensorFlow模型?3分钟上手教程

如何使用GraphPipe快速部署TensorFlow模型?3分钟上手教程 【免费下载链接】graphpipe Machine Learning Model Deployment Made Simple 项目地址: https://gitcode.com/gh_mirrors/gr/graphpipe GraphPipe是一款让机器学习模型部署变得简单的工具&#xff0c…

2026/7/22 17:11:02 阅读更多 →
OpenZFS企业级部署方案:高可用性与灾难恢复配置

OpenZFS企业级部署方案:高可用性与灾难恢复配置

OpenZFS企业级部署方案:高可用性与灾难恢复配置 【免费下载链接】openzfs OpenZFS on Linux and FreeBSD 项目地址: https://gitcode.com/gh_mirrors/op/openzfs OpenZFS是一款强大的开源文件系统,为企业环境提供了卓越的数据管理能力&#xff0c…

2026/7/22 17:11:02 阅读更多 →
深入解析McBSP多通道通信:从硬件原理到工程实践

深入解析McBSP多通道通信:从硬件原理到工程实践

1. McBSP多通道通信:从硬件原理到工程实践在嵌入式系统,尤其是数字信号处理器(DSP)的世界里,高效、可靠的数据交换是系统性能的基石。无论是工业控制中的多路传感器数据采集,还是音频处理中的多声道音频流&…

2026/7/22 17:11:02 阅读更多 →
别再手动改稿了!用AI自动完成知识萃取→大纲生成→案例植入→测验嵌入全流程(实测效率提升11.8倍)

别再手动改稿了!用AI自动完成知识萃取→大纲生成→案例植入→测验嵌入全流程(实测效率提升11.8倍)

更多请点击: https://intelliparadigm.com 第一章:别再手动改稿了!用AI自动完成知识萃取→大纲生成→案例植入→测验嵌入全流程(实测效率提升11.8倍) 传统课程开发常需数日反复打磨:从原始文档中人工提取知…

2026/7/22 17:10:01 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻