zoukankan      html  css  js  c++  java
  • ACM题目————列变位法解密

    这是在百度之星看到的。

    Problem Description

    列变位法是古典密码算法中变位加密的一种方法,具体过程如下 将明文字符分割成个数固定的分组(如5个一组,5即为密钥),按一组一行的次序整齐排列,最后不足一组不放置任何字符,完成后按列读取即成密文。

    比如:

    原文:123456789

    密钥:4

    变换后的矩阵:

    1234

    5678

    9xxx

    (最后的几个x表示无任何字符,不是空格,不是制表符,就没有任何字符,下同)

    密文:159263748

    再比如:

    原文:Hello, welcome to my dream world!

    密钥:7

    变换后的矩阵:

    Hello,

    welcome

    to my

    dream w

    orld!xx

    密文:

    Hw doeetrrlloellc adoomm!,my e w

    实现一个利用列变位法的加密器对Bob来说轻而易举,可是,对Bob来说,想清楚如何写一个相应的解密器似乎有点困难,你能帮帮他吗?

    Input

    第一行一个整数TTT,表示TTT组数据。

    每组数据包含222行

    第一行,一个字符串s(1≤∣s∣≤1e5)s(1 leq |s| leq 1e5)s(1s1e5),表示经过列变位法加密后的密文

    第二行,一个整数K(1≤K≤∣s∣)K(1 leq K leq |s|)K(1Ks),表示原文在使用列变位法加密时的密钥

    输入保证密文字符串中只含有ASCII码在[0x20,0x7F)[0x20,0x7F)[0x20,0x7F)范围内的字符

    Output

    对于每组数据,先输出一行

    Case #i:

    然后输出一行,包含一个字符串s_decrypt,表示解密后得到的明文

    Sample Input
    4
    159263748
    4
    Hw doeetrrlloellc adoomm!,my  e w
    7
    Toodming is best
    16
    sokaisan
    1
    
    Sample Output
    Case #1:
    123456789
    Case #2:
    Hello, welcome to my dream world!
    Case #3:
    Toodming is best
    Case #4:
    sokaisan

    第一眼的感觉就是。。。水题!事实证明的确是的!

    简单的模拟,就不解释了!直接上代码!

    //列变位法解密
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    
    using namespace std;
    const int MAX = 10000005 ;
    char str[MAX], ans[MAX];
    
    int main()
    {
        int T, k, n, s;
        scanf("%d",&T);
        getchar();
        for(k=1; k<=T; k++)
        {
            gets(str);
            scanf("%d",&n);
            getchar();
            int len = strlen(str);
            int x = len/n+1;
            int y = len % n;
            int cnt = 0;
            for(int i = 0; i < y; i++)
            {
                for(int j = 0; j < x; j++)
                {
                    ans[i+n*j] = str[cnt++];
                }
            }
            for(int i = y; i < n; i++)
            {
                for(int j = 0 ; j < x - 1; j++)
                {
                    ans[i+n*j] = str[cnt++];
                }
            }
    
            printf("Case #%d:
    ",k);
            for(int i=0; i<cnt; i++)
                printf("%c",ans[i]);
            printf("
    ");
        }
    
        return 0;
    }
    
    低调做人,高调做事。
  • 相关阅读:
    MySQL GROUP BY多个字段分组用法详解
    Linux下自动备份MySQL数据库并上传到远程FTP服务器
    mysql服务器主从数据库同步配置(转)
    centos上安装配置java WEB环境_java(转)
    Win7和Vista的安全机制对于应用程序读取配置文件相关操作的影响(虚拟重定向技术)
    firemonkey 手机屏幕自适应程序问题
    Delphi中无边框窗体应用程序使任务栏右键菜单有效的方法
    GetClass与RegisterClass的应用一例
    Delphi中的动态包,有详细建立包的步骤(答案很简单:因为包的功能强大)
    JS开发调试
  • 原文地址:https://www.cnblogs.com/Asimple/p/5477886.html
Copyright © 2011-2022 走看看