当前位置: 代码迷 >> C语言 >> 求输入问题 NB的人不妨看看!!!
  详细解决方案

求输入问题 NB的人不妨看看!!!

热度:166   发布时间:2008-03-08 11:37:02.0
求输入问题 NB的人不妨看看!!!
改变阿拉伯字母的顺序是文本加密中十分常用的方法,但是并不安全。也就是说,把文本中的每一个阿拉伯字母都要一致地替换成一些其他的字母。为了保证加密的可逆性,需要每个阿拉伯字母都有唯一一个替换的字母(也就说,任意两个阿拉伯字母都不可以用同一个字母来替换)。

最有效的密码分析方法就是“已知明文攻击(known-plaintext attack)”法。在此种方法中,密钥专家掌握着敌方加密的短语或语句,然后通过观察这些加密文字从而推导出译码的方法。

你现在的任务就是来破译几行加密的文本。假设每行采用了相同的替换集合,且其中某行加密前是:

the quick brown fox jumps over the lazy dog输入
首先是单独一个正整数用来说明测试的组数,后边跟着一个空白行。而且,连续两组测试之间也有一个空白行。

每组测试有多行输入组成。加密的方式如上所示。加密的文本行只包含有小写字母和空格,而且长度不超过80个字符。最多有100条输入的文本行。

输出
对应每组测试, 解密每一行的信息,并且把标准输出打印出来。如果有多于一种的解密方法,那么任何一种都可以。如果没有解密的方法,则输出信息“No solution.”

每两组测试输出之间必须用一个空白行分隔开。
例如输入:
1

vtz ud xnm xugm itr pyy jttk gmv xt otgm xt xnm puk ti xnm fprxq
xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj
frtjrpgguvj otvxmdxd prm iev prmvx xnmq
输出
now is the time for all good men to come to the aid of the party
the quick brown fox jumps over the lazy dog
programming contests are fun arent they
不会解决有一行空,不知怎么输入
搜索更多相关的解决方案: 输入  

----------------解决方案--------------------------------------------------------
程序代码:

#include <iostream>
#include <cstring>
#include <cctype>
#include <assert.h>
using namespace std;

const char* mode="the quick brown fox jumps over the lazy dog";
const int mode_len=strlen(mode);
char str[101][100];
char Map[26];//密文到原文的映射
int n;

int isalike(const char* mode,const char* s)
{
    if(strlen(s)!=mode_len)return 0;
    memset(Map,0,sizeof(Map));
    for(int i=0;i<mode_len;i++){
        if((mode[i]==' ')^(s[i]==' '))return 0;
        if((mode[i]==' ') && (s[i]==' '))continue;
        assert(islower(mode[i]) && islower(s[i]));
        if(Map[s[i]-'a']==0){
            //并不需要判mode[i]这个字符是否已经被映射到过,小写字母集是mode串的子集,可以保证这个映射是双射
            Map[s[i]-'a']=mode[i];
        }
        else {
            if(Map[s[i]-'a']!=mode[i])return 0;
        }
    }
    return 1;
}

int main()
{
    int T;
    scanf("%d",&T);
    assert(getchar()=='\n');
    assert(getchar()=='\n');
    while(T--){
        int k=-1;
        for(n=0;gets(str[n]) && str[n][0] ;n++){
            if(k==-1 && isalike(mode,str[n])){
                k=n;
            }
        }
        if(k==-1){
            printf("No solution.\n");
        }
        else {
            for(int i=0;i<n;i++){
                for(char* p=str[i];*p;p++){
                    if(*p==' ')putchar(' ');
                    else putchar(Map[*p-'a']);
                }
                putchar('\n');
            }
        }
        if(T)putchar('\n');
    }
}



[[it] 本帖最后由 leeco 于 2008-3-8 15:56 编辑 [/it]]
----------------解决方案--------------------------------------------------------
  相关解决方案