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

UVa 179 Code Breaking

题目分析题目描述了一种简单的加密方法周期置换加密。给定一个周期kkk和一个长度为kkk的置换即111到kkk的一个排列将明文按kkk个字符一组进行分组最后一组不足时用?补齐然后对每组应用该置换得到密文。输入包含若干个三元组(plaintext, ciphertext1, ciphertext2)每行一个字符串以单独一行#结束。我们需要判断是否存在某个周期kkk和对应的置换使得plaintext加密后得到ciphertext1。如果存在选择最小的kkk题面保证此时置换唯一然后将ciphertext2按照逆置换解密并输出不足时补?。如果不存在这样的置换则直接输出ciphertext2原样。解题思路1. 候选周期kkk的筛选对于某个kkk若存在一个置换将plaintext映射到ciphertext1则对于每个长度为kkk的块最后一组可以不足块中字符的多重集必须相同。因为置换只是重新排列字符不改变字符集合。因此我们可以枚举所有可能的kkk从111到plaintext的长度对每个kkk将明文和密文按kkk分组比较每组的排序后结果是否一致。若所有组都一致则kkk是一个候选周期。2. 验证置换的存在并找出最小kkk对于候选周期kkk需要判断是否存在一个长度为kkk的置换将明文块映射到对应的密文块。由于kkk较小输入行长度不超过808080我们可以采用以下两种方法全排列枚举当k≤7k \le 7k≤7时k!k!k!较小可直接枚举所有排列进行验证。回溯DFS\texttt{DFS}DFS匹配当kkk较大时利用每个位置上的字符对应关系进行约束回溯。因为一个置换将明文的第iii个字符映射到密文的第p(i)p(i)p(i)个位置实际上等价于寻找一个双射满足plaintext[i] ciphertext1[p(i)]。我们可以从第一个块中提取这种对应关系然后递归构造置换。由于kkk从111到nnn递增进行尝试第一个成功的就是最小的kkk。3. 解密ciphertext2\texttt{ciphertext2}ciphertext2找到置换后存储在key数组中key[i]表示明文中第iii个字符在密文中的位置从111开始解密需要应用逆置换对于密文中的第jjj个位置它对应明文中的第pos[j]个位置。我们可以先求出逆置换inv然后按kkk分组对ciphertext2进行解密每组不足时用?补齐。代码实现// Code Breaking// UVa ID: 179// Verdict: Accepted// Submission Date: 2016-03-27// UVa Run Time: 0.026s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;string plaintext,cyphertext1,cyphertext2;vectorintk,key;// k存放所有候选周期key存放找到的置换1-indexed// 给定明文块用当前key加密返回密文块stringencrypt(string plain){stringencrypted(plain);for(inti0;i(int)key.size();i)encrypted[key[i]-1]plain[i];returnencrypted;}// 使用当前key对密文进行解密并输出每组不足补?voiddecrypt(string encrypted){intindex0;intkeyLengthkey.size();inttextLengthencrypted.length();while(indextextLength){intsubLengthmin(keyLength,textLength-index);string subEncryptedencrypted.substr(index,subLength);// 补全到keyLength长度便于置换while((int)subEncrypted.length()keyLength)subEncrypted?;// 应用逆置换key中存储的是正向映射此处直接按正向输出即可// 注意这里的key在解密时实际上是正向映射但因为我们加密时是encrypted[key[i]-1] plain[i]// 所以解密时应该取encrypted的第j个字符放到plain的第?位等价于正向映射本身。// 更准确地说如果key[i]表示plain[i]去了密文的key[i]位置则解密时密文位置key[i]-1的字符应回到i。// 这里的写法是直接按key索引输出实际上是正确的见题目样例验证。for(inti0;ikeyLength;i)coutsubEncrypted[key[i]-1];indexkeyLength;}}// 验证当前key是否能将plaintext映射为cyphertext1boolverifyKey(){intindex0;intkeyLengthkey.size();inttextLengthplaintext.length();while(indextextLength){intsubLengthmin(keyLength,textLength-index);string subPlainplaintext.substr(index,subLength);string subEncryptedcyphertext1.substr(index,subLength);// 补全到keyLength长度while((int)subPlain.length()keyLength)subPlain?;while((int)subEncrypted.length()keyLength)subEncrypted?;if(encrypt(subPlain)!subEncrypted)returnfalse;indexkeyLength;}returntrue;}// 初始化key为[1,2,...,keyLength]voidinitializeKey(intkeyLength){key.clear();for(inti1;ikeyLength;i)key.push_back(i);}// 小k时直接全排列验证boolfindPermutation(intkeyLength){initializeKey(keyLength);do{if(verifyKey())returntrue;}while(next_permutation(key.begin(),key.end()));returnfalse;}// ---------- 回溯法找置换大k时用 ----------intmaxTimesTry10000;// 避免极端情况inttimesTried0;boolkeyFoundfalse,finishfalse;string source,target;// 当前块的明文和密文vectorboolmatched;// 标记密文字符是否已被分配voidbacktrack(intindex,intkeyLength){if(indexkeyLength){if(verifyKey()){keyFoundtrue;finishtrue;}if(timesTriedmaxTimesTry)finishtrue;return;}// 明文第index个字符必须匹配密文的某个未被占用的位置的字符for(inti0;i(int)target.length();i){if(!matched[i]source[index]target[i]){matched[i]true;key[index]i1;// 置换值从1开始backtrack(index1,keyLength);if(finish)return;matched[i]false;}}}// 利用第一个完整的块进行回溯匹配boolfindKeyByBacktrack(intkeyLength){// 找到第一个完整的块长度等于keyLengthintindex0;while(index(int)plaintext.length()){initializeKey(keyLength);finishfalse;timesTried0;keyFoundfalse;sourceplaintext.substr(index,keyLength);targetcyphertext1.substr(index,keyLength);if((int)source.length()keyLength)break;// 最后一个不完整块不作为依据matched.assign(keyLength,false);backtrack(0,keyLength);if(keyFound)break;indexkeyLength;}returnkeyFound;}// 在候选周期k中寻找可行置换boolfindKey(){for(inti0;i(int)k.size();i){// 小k直接全排列if(k[i]7findPermutation(k[i]))returntrue;// 大k回溯if(findKeyByBacktrack(k[i]))returntrue;}returnfalse;}// 筛选候选周期k通过字符多重集比较boolfindK(){k.clear();intkeyLength1;inttextLengthplaintext.length();while(keyLengthtextLength){intindex0;boolkeyLengthMatchedtrue;while(indextextLength){intsubLengthmin(keyLength,textLength-index);string subText1plaintext.substr(index,subLength);string subText2cyphertext1.substr(index,subLength);sort(subText1.begin(),subText1.end());sort(subText2.begin(),subText2.end());if(subText1!subText2){keyLengthMatchedfalse;break;}indexkeyLength;}if(keyLengthMatched)k.push_back(keyLength);keyLength;}return!k.empty();}intmain(){cin.tie(0);cout.sync_with_stdio(false);while(getline(cin,plaintext),plaintext!#){getline(cin,cyphertext1);getline(cin,cyphertext2);if(findK()findKey())decrypt(cyphertext2);elsecoutcyphertext2;cout\n;}return0;}算法复杂度筛选候选kkkO(n2log⁡n)O(n^2 \log n)O(n2logn)nnn为字符串长度。置换查找小kkk时O(k!⋅n)O(k! \cdot n)O(k!⋅n)大kkk时通过回溯剪枝实际效率很高。整体可在输入规模下高效运行。总结本题的核心在于两点利用字符多重集快速筛选可能的周期kkk避免无效枚举。对于给定的kkk通过置换匹配小范围枚举或回溯确定具体的映射关系并选择最小的可行kkk。解密时注意应用逆置换并正确处理末尾补?的情况。

相关文章:

UVa 179 Code Breaking

题目分析 题目描述了一种简单的加密方法:周期置换加密。给定一个周期 kkk 和一个长度为 kkk 的置换(即 111 到 kkk 的一个排列),将明文按 kkk 个字符一组进行分组(最后一组不足时用 ? 补齐),然…...

无线音频技术解析:从基础原理到工程实践

1. 无线音频技术基础与核心指标解析在便携音频设备领域,无线传输技术已经彻底改变了用户的聆听体验。作为一名音频工程师,我见证了从早期红外传输到现代2.4GHz射频技术的演进过程。无线音频系统的核心在于保持与有线连接相当的音质表现,这需要…...

Tauri 2.0 + Next.js 16 桌面应用开发模板全解析

1. 项目概述与核心价值 如果你正在寻找一个能快速启动桌面应用开发的现代技术栈模板,那么 kvnxiao/tauri-nextjs-template 绝对值得你花时间研究。这个模板将两个看似不同领域的技术——用于构建现代Web前端的Next.js和用于创建跨平台桌面应用的Tauri——巧妙地结…...

Sherlock AI Plugin:自动化探测项目中AI集成的安全审计工具

1. 项目概述:一个能“嗅探”AI插件的侦探工具 如果你和我一样,在日常开发或者安全审计中,经常需要快速了解一个项目里集成了哪些AI能力,那你肯定遇到过这样的麻烦:你得手动去翻看代码库的配置文件、依赖声明&#xff0…...

Docker Compose全栈开发沙盒:OpenClaw工作空间实战指南

1. 项目概述:一个为“OpenClaw”量身打造的全栈开发沙盒 如果你正在开发一个名为“OpenClaw”的项目,无论是想快速搭建一个演示环境,还是需要一个标准化的开发、测试沙盒,那么 win4r/openclaw-workspace 这个项目很可能就是你正…...

AI代理成本管理:基于MCP协议构建成本监控与预算控制系统

1. 项目概述:一个为AI代理成本管理而生的MCP服务器最近在折腾AI应用开发,特别是基于大语言模型的智能代理(Agent)时,发现一个挺头疼的问题:成本不可控。你给Agent接上各种工具,让它去调用搜索引…...

Rust代码知识图谱构建:从静态分析到架构洞察的工程实践

1. 项目概述:一个为Rust代码量身定制的知识图谱构建工具如果你和我一样,长期在Rust生态里摸爬滚打,面对一个动辄几十个模块、依赖关系错综复杂的中大型项目时,肯定有过这样的体验:想理清某个核心结构体的所有使用路径&…...

Windows控制台光标定位工具elocate:原理、部署与实战应用

1. 项目概述:Windows控制台光标定位工具在Windows命令行下干活,尤其是写一些需要动态更新屏幕内容的脚本时,光标位置的控制是个挺让人头疼的事儿。你没法像在图形界面里那样,直接用鼠标点一下,或者调用一个简单的API就…...

高瞬态高功率激光级储能锂电池系统设计要求【浩博电池】

高能激光类设备(工业/科研级)对电源系统的核心要求是: 极短时间内释放极高功率 极低内阻 极高稳定母线电压 极强安全冗余控制能力。一、系统总体设计目标该类高功率脉冲能源系统需满足:毫秒级瞬态放电能力(脉冲负载…...

2025年实时影响因子: 全球期刊(26.5.2更新)

点击蓝字 关注我们2025年实时影响因子: 全球期刊近日,我们通过Web of Science 官网数据库,对全球期刊开展系统性分析。本次重点筛选2025年影响因子 (IF) 排名靠前的100本核心期刊,涵盖54本研究类期刊与46本综述期刊两大类别。在研究类期刊中&…...

【RAG】【node_postprocessor02】Cohere Rerank 重排序功能完整案例

本案例演示如何使用Cohere Rerank重排序器来提高检索增强生成(RAG)系统的检索质量,通过重排序初始检索结果来获取更相关的文档片段。1. 案例目标本案例的主要目标是展示如何:使用LlamaIndex构建基本的向量检索系统集成Cohere Rerank重排序器优化检索结果…...

特种自动化运输平台锂电池完整设计方案要求【浩博电池】

特种自动化运输平台锂电池完整设计方案要求特种自动化运输平台广泛应用于危化品转运、军工物流、港口重载调度、矿山无人运输、核电站物资搬运及高风险工业区域自动化作业场景。其核心特征是复杂环境运行、无人化控制、高安全等级要求、强负载能力与多工况适配。因此&#xff0…...

DC综合揭秘:你的case语句为啥没变成MUX?用RTL原语精准控制GTECH映射

DC综合揭秘:用RTL原语精准控制case语句的MUX映射 在数字IC设计流程中,RTL代码到门级网表的综合过程就像一场精心编排的魔术表演。设计工程师写下优雅的case语句,期待它在综合后变成预期的多路选择器(MUX),但…...

AI编码助手技能面板:用SwiftUI打造高效提示词工作流

1. 项目概述:一个为AI编码助手设计的原生技能面板如果你和我一样,日常开发重度依赖Cursor、Claude Code这类AI编码助手,那你一定遇到过这样的场景:你正在SwiftUI里构建一个复杂的视图,需要快速生成一个符合苹果人机界面…...

FPGA串口通信IP核wbuart32集成指南:从Wishbone总线到驱动开发

1. 项目概述:一个轻量级的串口通信IP核最近在搞一个FPGA上的嵌入式小系统,需要和上位机进行简单的数据交互。像UART这种串口通信,可以说是嵌入式开发里最基础、最常用的外设之一了。虽然很多商用或开源的SoC平台都集成了UART控制器&#xff0…...

如何处理SQL存储过程大结果集_采用输出参数返回数据

存储过程输出参数无法返回结果集,仅支持单个标量值;正确方式是直接SELECT、临时表或XML/JSON字符串输出,避免误用游标等非常规方案。存储过程不能用输出参数返回结果集SQL Server(以及绝大多数数据库)的输出参数 outpu…...

基于SystemC TLM-2.0的RISC-V处理器仿真框架构建与实战

1. 项目概述:一个基于TLM的RISC-V处理器仿真框架最近在处理器架构探索和软件生态早期开发的圈子里,一个绕不开的话题就是如何快速、高效地对一个新设计的CPU进行功能验证和软件移植。传统的FPGA原型验证虽然真实,但迭代周期长,环境…...

碧蓝航线皮肤提取

碧蓝航线的皮肤简单可以分为静态皮肤和动态Live2d皮肤。绝大部分资源文件都在Android/data/com.bilibili.azurlane/files/AssetBundles路径下,听说还有少部分资源文件在安装包apk文件的assets\AssetBundles路径下,不确定真假,至少我目前所需要…...

为什么IEEE标准委员会已将其纳入2026 AI安全评估参考框架?AISMM快速评估版的5项硬核认证指标

更多请点击: https://intelliparadigm.com 第一章:AISMM快速评估版的诞生背景与战略意义 人工智能安全成熟度模型(AISMM)快速评估版是面向中小规模AI研发团队与合规先行组织推出的轻量化、可落地的安全治理工具。其诞生源于三大现…...

扩散模型在图像编辑中的应用与优化实践

1. 扩散模型与图像编辑的技术融合去年我在处理一批商业摄影素材时,客户突然要求将照片中的阴天背景替换成阳光明媚的沙滩场景。传统Photoshop处理需要数小时精细修图,而使用扩散模型技术,我在15分钟内就输出了自然逼真的合成效果。这种技术革…...

新粗野主义React组件库:从设计原理到工程实践

1. 项目概述:当“新粗野主义”撞上组件库 如果你是一个前端开发者,或者对现代网页设计趋势有所关注,最近可能被一种名为“新粗野主义”的设计风格刷屏。它大胆、直接、甚至有些“粗糙”,用高饱和度的色彩、粗重的边框、不加修饰的…...

AI辅助Android开发实战:从零构建国标收藏应用

1. 项目概述:一个用AI工具“硬肝”出来的国标收藏App最近在做一个项目,需要频繁查阅国家标准,每次都得打开浏览器,登录“国家标准全文公开”网站,再在一堆搜索结果里翻找,效率实在太低。作为一个懒人&#…...

Cursor AI编程助手行为准则:.cursorrules配置详解与团队实践

1. 项目概述:一个为AI编程伙伴定制的“行为准则”如果你和我一样,深度使用Cursor这类AI驱动的代码编辑器,那你一定遇到过这样的场景:你满怀期待地让AI帮你重构一段复杂的业务逻辑,结果它生成的代码风格和你项目里现有的…...

全志D1 RISC-V开发套件深度评测与应用实践

1. Dongshan Nezha STU开发套件概览 Dongshan Nezha STU是一款基于全志D1 RISC-V处理器的开发套件,由核心模块和扩展底板组成。这个套件最吸引人的地方在于它的双重身份——既可以作为独立的单板计算机(SBC)使用,又能作为系统级模块(SoM)嵌入到其他设备中…...

丹诺医药通过上市聆讯:无营收,年亏1.5亿 现金流出净额8720万

雷递网 雷建平 5月6日丹诺医药(苏州)股份有限公司(简称:“丹诺医药”)今日通过上市聆讯,准备在港交所上市。丹诺医药成立以来获得过多次融资,其中,2022年1月到2023年1月完成D轮1.48亿…...

Taotoken 提供的标准 OpenAI 协议如何简化现有应用的迁移与集成工作

Taotoken 提供的标准 OpenAI 协议如何简化现有应用的迁移与集成工作 对于已经基于 OpenAI 官方 API 构建了应用或服务的开发者而言,引入新的模型服务或切换供应商往往意味着需要投入额外的适配和测试成本。Taotoken 平台通过提供与 OpenAI 官方 API 完全兼容的 HTT…...

终极指南:如何快速掌握Android虚拟摄像头,3个简单步骤实现视频替换

终极指南:如何快速掌握Android虚拟摄像头,3个简单步骤实现视频替换 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam 你是否厌倦了在视频会议中总是使用真实摄像头&a…...

win2xcur工具链:跨平台光标主题转换的完整解决方案

1. 项目概述:跨平台光标主题转换的瑞士军刀如果你和我一样,是个喜欢折腾桌面美化的Linux用户,或者是个想把心爱的Linux光标带到Windows上的玩家,那你肯定遇到过光标格式不兼容这个老大难问题。Windows用的是.cur和.ani格式&#x…...

Python Tkinter大作业荜邺设计学生信息管理系统项目源码白菜价MySQL

一、项目介绍系统角色分为游客、管理员两种角色。游客功能包括:学院查询,专业查询,学生查询,公告查询。管理员功能包括:学院管理,专业管理,学生管理,公告管理,修改密码。…...

AI智能体成本管理实战:基于MCP协议的成本监控与优化

1. 项目概述:当AI智能体开始“精打细算”最近在折腾AI智能体(Agent)的开发,一个绕不开的痛点就是成本控制。无论是调用OpenAI的GPT-4,还是使用Claude、Gemini等大模型,每一次API调用都意味着真金白银的支出…...