Bailian2818 密码【密码+置换】

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;
}

猜你喜欢

转载自www.cnblogs.com/tigerisland45/p/10165388.html