列表

详情


NC214456. 密码破译

描述

代号008的特工James Leaves截获了一些敌国的密文,经过一段时间的破译,Leaves终于弄清了密文的加密方式。敌国会先对明文进行一次恺撒加密,得到中间密文,再对中间密文进行一次栅栏加密,得到最终密文。

两种加密方式解释如下:

恺撒加密方式:将明文中的所有字母都在字母表上向后偏移x位,得到密文。当x为1时,a变成b,b变成c……z变成a。例如:明文为"winterzzl",x为2时,将明文中的所有字母向后偏移2位,加密后的结果为"ykpvgtbbn"。

栅栏加密方式:将明文平分为2组,先取每组的第1个字母,再取每组的第2个字母……直到取完为止。若明文无法被平分,则第1组比第2组多1个字母。例如:明文为"tokitsukaze",将明文平分为2组,分别为"tokits"和"ukaze",按顺序取完后的结果为"tuokkaiztes"。

Leaves将最终密文和恺撒加密的偏移量x给你,请你恢复出明文。

输入描述

第一行有一个正整数,表示有T组数据。

每组数据的第一行有一个字符串,表示最终密文,保证字符串$s$全部由小写字母组成。 

每组数据的第二行有一个数字,表示恺撒加密的偏移量。

输出描述

对于每组数据,输出加密前的明文。

示例1

输入:

2
ixfpmsmmpe 1
ijqcqxfgnhwwepm 2

输出:

helloworld
goodluckhavefun

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang11) 解法, 执行用时: 3ms, 内存消耗: 372K, 提交时间: 2020-12-06 20:57:06

#include <string.h>
#include <stdio.h>
int main(){
	int t;
	scanf("%d",&t);
	while(t--)
	{
		char ch[1000];
		int k,l,i;
    	scanf("%s%d",ch,&k);
    	l=strlen(ch);
    	for(int i=0;i<l;i++)
    	{
    		int num=ch[i]-'a';
    		num=(num-k+26)%26;
    		ch[i]=num+'a';
		}
    	for(int i=0;i<l;i+=2)
            printf("%c",ch[i]);
        for(int i=1;i<l;i+=2)
        	printf("%c",ch[i]);
        printf("\n");
	}
	return 0;
}

C++(clang++11) 解法, 执行用时: 6ms, 内存消耗: 632K, 提交时间: 2020-12-07 22:59:56

#include <bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin >> n;
	while(n--){
		string str, s1 = "", s2 = "";
		int k;
		cin >> str >> k;
		for(int i = 0; i < str.length(); i++){
			str[i]=(26+str[i]-'a'-k)%26+'a';
			if(i & 1) s2 += str[i] ;
			else s1 += str[i];
		}
		s1 += s2;
		cout << s1 << endl;
	}
	return 0;
}

上一题