【计算思维机试2】B.密码之神

文章讲述了密码爱好者pengym设计的独特加密规则,使用字符串中的子串长度对应密文中的特定字符,挑战读者破译一系列密文。作者通过实例和代码解释了如何根据给定的密钥和密文进行解密过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 题目

众所周知,pengym 是一个对密码学很有兴趣的人,或者说是密码之神。

这代表着,他经常喜欢用各种各样的方式来加密自己想传递的信息,然后再找人想办法破译,这样就会带给其他人一种挑战与破译的快乐感。今晚,他找到了你。为了能够一起度过一个神奇且美好的夜晚,他特意设计了一套特殊的加密方法,请你仔细阅读:

在密码学中通常有明文 P、密文 C 和密钥 K 的概念,即明文 P(真正想表达的内容)通过密钥 K 的加密规则进行加密,从而得到让人难以直接阅读到有效信息的密文 C。而我们通常所谓的破译,也就是将密文 𝐶C 通过一定的方式(运用公钥或私钥等,在此不做展开介绍)进行解读,进而重新得到明文 𝑃P。

pengym 设计的密钥加密规则是这样的,他用一个字符串 S 来表示密钥,字符串 S 中包含大写字母、小写字母、数字、空格等。每两个相邻空格(默认字符串的最前与最后存在空格)之间可能会有许多字符。如果将两个相邻空格之间的字符看作一个新的字符串 T,pengym 用字符串 T 的长度 |T| 来指示此时应提取密文 C 中的第 |T| 个关键字符。

可以对上述规则举例说明,在密钥 a bdc 的作用下,密文 4213 对应的明文应该是 41,因为第一个字符串 T1 为 a,长度为 1,故对应密文中的第一个字符 4,第二个字符串 T2 为 bdc,长度为 3,对应密文中的第三个字符 1

pengym 现在把密钥和密文都悄悄告诉你,请聪明的你来帮他破译一下吧~

输入数据

第一行输入一个字符串 S,表示题目中所描述的密钥。数据保证字符串 𝑆S 中仅包含大写字母、小写字母、数字、空格,且不会出现连续两个空格的情况。

第二行输入一个正整数 t,表示 pengym 需要你破译的密文个数。

接下来 t 行,每行输入一个字符串 C,表示你需要破译的密文。字符串 C 中包含大写字母、小写字母、数字。

输出数据

输出共 t 行。

每行一个字符串 P,表示你所破译出来的明文。

输入样例
as2 11 BBDDa 12312312 GGGG 6 qwertyuio 7777777
2
g02npzmey4
asdfghjklqwert
输出样例
20pengym
dsgkfalj
说明

对于 100%的数据:1≤t≤10;1≤|S|≤10^4;1≤|T|≤|C|≤|S|。

在第一组样例中,as2 长度为 3,对应字符 2,...... 依次对应后可以得到样例中的结果。

作者: pengym

思路

文字挺难理解的(感觉出题人是保密/网安专业的)

但是给的例子容易懂,大意就是字符串S的每个子串s的长度,可以从前往后排列构成一个数组,数组元素就对应着C中的第i个元素(下标为i-1)。

比如样例的字符串S:as2 11 BBDDa 12312312 GGGG 6 qwertyuio 7777777

vector<int> vec,里面储存的就是每个子串的长度。

即vec=[3,2,5,8,4,1,9,7]

从头到尾遍历vec,输出C[vec[i]-1],遍历完后换行。

心路

1.关于sstream

        本来想用sstream input来储存整个string S(包括空格),然后再流入子串string s实现字符串分割。但是实操时发现其实cin>>S就能以空格分割了,用sstream是多此一举。(其实也可以用sstream,就是有点麻烦而没必要)

        回看了一下之前的代码,上次用sstream是为了一个字符串分割的问题,那个题目要分割的字符串很麻烦,我记得有多空格,就用string->sstream->string这样的思路来分割了。

2.关于getline

        getline忘记语法格式了(乐)

        getline(cin,string s)从输入流里获取一行文字。

3.关于遍历条件

        j遍历的是vec的长度,不是c的长度。因为是“vec[j]-1”作为c的下标去搜索c的元素。

代码

#include <iostream>
#include <vector>
#include <string>
using namespace std;
string s, tmp;
char b;
vector<int> vec;
int main()
{
	getline(cin, s);
	int count = 0;
	int n;
	for (int i = 0; i < s.length(); i++)
	{
		if (s[i] != ' ')
			count++;
		else
		{
			vec.push_back(count);
			count = 0;
		}
	}
    //将最后一个子串长度压入vec
	vec.push_back(count);
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		string c;
		cin >> c;
		for (int j = 0; j < vec.size(); j++)
			cout << c[vec[j]-1];
		cout << endl;
	}
	return 0;
}

<think>好的,用户的问题是关于复项目中的IT相关信息。首先需要明确用户的具体需求,可能涉及复流程、考察内容、准备方法等方面。接下来,需要通过搜索工具查找相关的高质量信息源,比如教育网站、高校官方指南、技术博客等。 首先,搜索“考研复 IT 项目内容”可以找到关于复中常见的考察点,比如编程能力、算法题、项目经验等。然后,查看权威教育网站或高校的官方信息,了解不同院校的具体要求差异。例如,一些学校可能更注重理论,而另一些则侧重实践。 接着,关于准备方法,需要整合如何高效复习专业知识、提升编程能力的建议。可能包括刷题网站推荐、项目经验整理技巧等。同时,关注复中的注意事项,比如面技巧、简历制作要点等。 还需要确认最新的复趋势,比如线上复的技术要求,是否需要准备设备测、网络环境等。这些信息可能来自近年的经验分享或官方公告。 最后,确保信息整合时按照用户的要求分点陈述,避免使用步骤词汇,保持自然的结构。同时,检查是否遗漏了用户可能关心的其他方面,比如调剂信息、导师选择等,但根据问题范围,可能集中在IT相关部分。 在生成回答时,确保每个方法或步骤之间有换行,引用资料分散在相应部分,不集中在末尾。最后,根据内容提出三个相关问题,需与原始问题紧密相关,比如不同学校的差异、线上复准备、项目经验展示方法等。</think>根据考研复中IT相关项目的常见要求和最新信息,整理出以下核心要点和准备建议: **考察内容与形式** - 多数院校的计算类复包含笔和面 - 笔常考数据结构、算法、操作系统等核心课程,部分学校要求手写代码(如二叉树遍历、排序算法) - 面重点考察项目经历、编程能力、算法思维,可能涉及器学习基础(如SVM公式推导:$f(x) = w^T x + b$) **编程能力测** 部分学校采用OJ系统实时评测,常见题型包括: ```python # 力扣式算法题示例 def reverse_string(s: list) -> None: left, right = 0, len(s)-1 while left < right: s[left], s[right] = s[right], s[left] left += 1 right -= 1 ``` **项目经验准备** 1. 需准备1-2个完整项目,重点说明技术难点和解决方案 2. 掌握项目中使用的关键技术原理,如Web开发中的RESTful API设计原则 3. 了解项目延伸领域,如使用过MySQL需理解B+树索引结构 **最新趋势(2023-2024)** - 人工智能相关方向增加对Transformer、扩散模型等前沿技术的考察 - 系统设计题占比提升,需掌握微服务架构设计基础 - 部分院校新增网络安全方向复科目,涉及密码学基础(如RSA算法:$c = m^e \mod n$) **资源准备建议** - 算法刷题:LeetCode热题HOT100、剑指Offer系列 - 系统复习:参考《计算考研复指南》《王道考研复手册》 - 模拟面:通过牛客网、知乎等平台获取面经题库
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值