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

原文地址:https://www.cnblogs.com/tigerisland45/p/10165388.html

时间: 2024-10-11 05:14:16

Bailian2818 密码【密码+置换】的相关文章

RHCE7-学习里程 root 密码重置换

一.root 密码重置换 当忘记root 密码后,可以按照以下方法重置 root 密码 1.重启动电脑,出现如下界面,按  上  下 键盘, 选择   (core)--再按e 2.在下图linux16行中,将ro这两个字母修改为rw init=/sysroot/bin/sh 3.修改结果如下图所示,按ctrl+x进入单用户模式 4.使用命令访问系统: "chroot /sysroot" 重置密码:"passwd root" 更新selinux信息:"tou

如何取消Word文档保护密码(密码的破解方法)

Word-“取消文档保护”密码的破解方法 方法一(简单有效): 启动word 文档,新建一个空白文档,执行“插入文件” 命令,打开“插入文件”对话框,定位到需要解除保护的文档所在的文件夹,选中该文档,单击“插入”按钮,将加密保护的文档插入到新文档中,文档保护会被自动撤销. 方法二: 打开文档后,将其另存为XML 文件,然后用UltraEdit(或者EditPlus,下载华军里搜索一下就行了)这个编辑软件打开刚刚存储的XLM 文件,查找 ,这个“******" 是可变的.只需要找到这段文字,然后删

vue 登录 + 记住密码 + 密码加密解密

<template> <el-form :model="ruleForm"> <h3 class="title">系统登录</h3> <el-form-item prop="mobile"> <el-input type="text" v-model="ruleForm.mobile" auto-complete="off"

转载:深入 WEP和 WPA密码原理

1  概述  目前情况下: WEP的破解为利用加密体制缺陷,通过收集足够的数据包,使用分析密算法还原出密码. WPA目前没有加密体制的缺陷可被利用,破解WPA密码使用的是常规的字典攻击法. 所以在破解方式上WEP和WPA有很大差异.  2  WEP 2.1  (Wired EquIValent PrIVacy,WEP) 叫做有线等效加密.掌握WEP破解的人,肯能会说WEP不如有线的安全性高.但这 发生在WEP的很多弱点被发现之后.也是由于WEP的弱点导致WPA的出现.  2.2  (WEP)算法

破解并重置mysql密码

-破解并重置mysql密码 密码这东西,总有忘记的时候,或者是一下子没有记录下来,或者是上一手交接的时候根本没人跟你说,或者是老旧到连老领导也忘记的数据库,问题是该用还是得用,那就把它破解了呗. #先关闭mysql service mysqld stop #进入安全模式,可以免密码登录 /usr/local/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking& #免密码登陆 /usr/local/mysql/bin/mysql 

Linux下随机生成密码的命令总结

有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下命令来随机生成安全.符合密码复杂度的命令. 俗话说"工欲善其事必先利其器".如果能用挖土机的,你为什么要用锄头? 最近一直在反思自己:习惯性用原始.老旧的方式解决问题.而不擅长利用一些工具快捷.方便的解决问题. 1:mkpaswd命令 mkpasswd 是Linux自带的一个密码生成工具,

[优化]Swift 简简单单实现手机九宫格手势密码 解锁

我去 为毛这篇文章会被移除首页 技术含量还是有点的   如果在此被移除  那就果断离开园子了 之前的文章 Swift 简简单单实现手机九宫格手势密码解锁 1.对之前的绘制线条的方法进行优化 之前是遍历选中点的集合分别的在点之间绘制线条 改进之后使用系统的API一口气将线条绘制出来 2.增加密码错误情况下想某宝一样红色提示和三角形状的路线指示如下图所示 3.遇到的难点主要是三角形的绘制 和 旋转角度的功能 原理就不多说了 真相见代码 转载需要注明出处 http://www.cnblogs.com/

Shell脚本批量创建用户并随机生成密码

要求:批量创建10个系统账号oldboy01-oldboy10,并设置生成密码(密码不同). 实现脚本: #!/bin/bash #Question3 for i in $(seq -w 10) do         useradd -s /bin/bash oldboy$i         echo "password$i" | md5sum | tee -a passwd.txt | passwd --stdin  oldboy$i done 脚本执行效果: [[email pro

Centos下如何修改Mysql的root密码

1.用帐号登录mysql mysql –u root 或#mysql –uroot –p 2.改变用户数据库 命令:mysql>use mysql mysql> use mysqlReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -A Database changed 3.修改密码 密码要用pa

yum安装mysql后root用户的临时密码

1.查看root用户临时随机密码 yum 安装mysql后,无法通过空密码登录数据库,如下: 1 [[email protected]123 mysql]# mysql -u root -p 2 Enter password: 3 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 查找后,原来为了增加数据库的安全性,在安装时会为root用户生成一个临时的随机密码,存放在/var/l