| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 485 人关注过本帖
标题:求输入问题 NB的人不妨看看!!!
只看楼主 加入收藏
20072815
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2007-12-1
收藏
 问题点数:0 回复次数:1 
求输入问题 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
不会解决有一行空,不知怎么输入
搜索更多相关主题的帖子: 输入 
2008-03-08 11:37
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
程序代码:
#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]]
2008-03-08 15:47
快速回复:求输入问题 NB的人不妨看看!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025367 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved