2818:密码
总时间限制: 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
来源
1026
问题链接:Bailian2818 密码
问题描述:(略)
问题分析:
????这是一个密码编码计算题,通过置换计算密码。然而,直接通过置换计算进行模拟则容易造成TLE。置换计算有周期性,算出其循环周期,就可以使用模除来减少模拟次数。本题需要做k次置换,k值有可能很大。
程序说明:
????本题与参考链接是同一题,使用参考链接的程序提交就AC了。
参考链接:POJ1026 Cipher【密码+置换】
题记:朋友交多了,容易遇见熟人。
AC的C语言程序(优化枚举)如下:
/* POJ1026 Cipher */
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int N = 200;
int a[N], cycle[N];
char s[N + 1], ans[N + 1];
int main()
{
int n, k;
while(~scanf("%d", &n) && n) {
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
a[i]--;
}
// 计算循环数组
for(int i = 0; i < n; i++) {
int cnt = 0, key = i;
while(a[key] != i) cnt++, key = a[key];
cycle[i] = cnt + 1;
}
while(~scanf("%d", &k) && k) {
getchar();
gets(s);
for(int i = strlen(s); i < n; i++)
s[i] = ' ';
for(int i = 0; i < n; i++) {
int t = i, ti = i;
int times = k % cycle[i]; // 对字符s[i],进行times次变换
for(int j = 0; j < times; j++) {
t = a[ti];
ti = t;
}
ans[t] = s[i];
}
ans[n] = '\0';
printf("%s\n", ans);
}
printf("\n");
}
return 0;
}
原文地址:https://www.cnblogs.com/tigerisland45/p/10165388.html