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 阅读更多 →

最新新闻

大一学生想学数据分析,先学 Excel 还是 AI 工具?

大一学生想学数据分析,先学 Excel 还是 AI 工具?

刚踏入大学校园,不少经管、人文、计算机专业的新生都萌生了学习数据分析的想法,但几乎所有人都会陷入同一个选择困境:入门阶段优先深耕 Excel,还是直接上手各类 AI 分析工具?当下生成式 AI 普及,很多短视频…

2026/7/24 0:49:45 阅读更多 →
大学生想做数据分析,大学四年完整准备路径

大学生想做数据分析,大学四年完整准备路径

在数字化转型加速的当下,数据分析已成为互联网、金融、零售、制造业通用核心岗位。LinkedIn 2026 年统计 2500 条国内数据分析招聘需求显示,SQL、Python、可视化工具、AI 辅助分析四大能力是企业筛选应届生的硬性标准,仅 32% 应届毕业生在校完…

2026/7/24 0:49:45 阅读更多 →
Power BI | 为啥你的 Power BI 刷新巨慢?

Power BI | 为啥你的 Power BI 刷新巨慢?

数据源慢?服务器性能不够? 为什么你的报表刷新巨慢,可能是你没搞懂查询折叠✦ 本期核心问题 不是数据源慢,是你把1200万行全拉到本地算。 01、刷新6分钟,谁都不承认 小李负责的销售日报,每天早上8:30自动刷…

2026/7/24 0:49:45 阅读更多 →
从注射到口服:Lipfendra如何重塑高胆固醇血症长期管理的日常场景【海得康】

从注射到口服:Lipfendra如何重塑高胆固醇血症长期管理的日常场景【海得康】

高LDL-C是动脉粥样硬化性心血管疾病的核心可控危险因素,而ASCVD至今仍是全球排名第一的死亡原因,全球范围内有超过数亿患者需要长期接受强化降脂治疗。过去数十年间,临床降脂治疗始终存在难以破解的“疗效与便捷性矛盾”:他汀类药…

2026/7/24 0:49:45 阅读更多 →
WAIC2026 洞察:具身智能驶入量产时代,望获 OS 筑牢国产实体 AI 底层根基

WAIC2026 洞察:具身智能驶入量产时代,望获 OS 筑牢国产实体 AI 底层根基

为期数日的 2026 世界人工智能大会(WAIC)圆满落幕,作为全球人工智能产业风向标,本届大会清晰勾勒出行业迭代新方向。过往数年,人形机器人、服务机器人参展,大多以舞蹈互动、特技翻转、趣味展演吸引观众目光…

2026/7/24 0:48:45 阅读更多 →
Spring 源码系列(8): 依赖注入(DI)在源码里如何发生

Spring 源码系列(8): 依赖注入(DI)在源码里如何发生

引子 你只写了 Autowired private UserService userService;,对象就自动出现了。这背后 Spring 到底做了什么? 本篇回答三件事:① DI 发生在哪一步;② Autowired 和 Resource 的区别在源码层如何体现;③ 字段 / 构造器…

2026/7/24 0:48:45 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/23 17:49:47 阅读更多 →

月新闻