密码

总时间限制: 

1000ms

 

内存限制: 

65536kB

描述

Bob 和 Alice 开始使用一种全新的编码系统。它是一种基于一组私有钥匙的。他们选择了n个不同的数a1 , . . .,an, 它们都大于0小于等于n。 机密过程如下:待加密的信息放置在这组加密钥匙下,信息中的字符和密钥中的数字一一对应起来。信息中位于i位置的字母将被写到加密信息的第ai个位置, ai 是位于i位置的密钥。加密信息如此反复加密,一共加密 k 次。

信息长度小于等于n。如果信息比 n 短, 后面的位置用空格填补直到信息长度为n。 

请你帮助 Alice 和 Bob 写一个程序,读入密钥,然后读入加密次数 k 和要加密的信息,按加密规则将信息加密。 


 

输入

输入包括几块。每块第一行有一个数字n, 0 < n <= 200. 接下来的行包含n个不同的数字。数字都是大于0小于等于n的。下面每行包含一个k和一个信息字符串,它们之间用空格格开。每行以换行符结束,换行符不是要加密的信息。每个块的最后一行只有一个0。 最后一个块后有一行,该行只有一个0。 

输出

输出有多个块,每个块对应一个输入块。每个块包含输入中的信息经过加密后的字符串,顺序与输入顺序相同。所有加密后的字符串的长度都是 n。 每一个块后有一个空行。 

样例输入

10
4 5 3 7 2 8 1 6 10 9
1 Hello Bob
1995 CERC
0
0

样例输出

BolHeol  b
C RCE

纸上画画可以找出来规律,每位的字符都是有加密周期的。根据加密周期的特点可以省略过去成千上万次循环。

每位与每位加密周期并不相同。(概率相同,没什么用。)

掌握了cin.ignore()//如果不输入,string[0]始终带着“ ”,很麻烦。ignore忽略掉了空格

例如读取1995 saf

cin>>shuzhi;

cin.ignore();

getline(cin,string);

#include<iostream>
#include<string>
using namespace std;
int main() {
	int n, jiamicishu;
	int miyao[205] = { 0 };
	while (true)
	{
		cin >> n;
		if (n == 0) {
			return 0;
		}
		for (int i = 1; i < n+1; i++)
		{
			cin >> miyao[i];
		}//对秘钥进行输入	
		cin >> jiamicishu;
		while (jiamicishu!=0)
		{		
			string Old, New;//Old是原始的字符串,New是最终输出的
			cin.ignore();
			getline(cin, Old);
			for (int i = Old.length(); i < n; i++)
			{
				Old += " ";
			}
			New = Old;//完成了字符串不足秘钥长度是的空格补齐。
			int c;  int jia;//jia是取余后的结果。
			for (int i = 1; i < Old.length()+1; i++)
			{
				int zhouqi = 1;
				c = i;
				for (int j = 0; j < jiamicishu; j++)
				{
					c = miyao[c];//模拟加密
					zhouqi++;
					if((i)==(miyao[c]))//对模拟加密过程进行判断,看是否回到了起始点,如果回到了起始点,则利用周期进行取余操作,直接对剩余的进行加密。
					{
						jia = jiamicishu % zhouqi;
						c = i;//重置,开始重新的较短的加密
						for (int k = 0; k < jia; k++)//注意jia要远小于jiamicishu
						{
							c = miyao[c];
						}
						break;
					}
				}
				New[c -1] = Old[i-1];//如果还没有验证出来加密周期就得出了结果那么直接输入即可。
			}

			cout << New << endl;
			cin >> jiamicishu;
		}cout << endl;
	}
	system("pause");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值