题目链接

Playfair is a kind of substitution cipher.And the encryption role is simple.In general,there are three steps in Playfair algorithm.

Step 1: Creat a 5*5 secret key table.

Step 2:Tidy plaintext : only leave letters and omit others And if there are capital letters in the plaintext,change it into lower letters.

Step 3: Work out the ciphertext.

Now, let’s see an example.

Firstly,we should creat a 5*5 secret key table.Let’s assume that “ulysses” is the key.If there is a letter appearing more than once we should only retain the first one and delete the others.So we can get the real key “ulyse”.Then we will fill the secret key table with the key “ulyse” and with the other letters which haven’t appeared in the key “ulyse” in order(assume j is equal to i,so every element in the table is unique and j won’t be in this table).Finally, we will get a secret key table as follows:

Secondly,assuming that we will send a important message “balloon”.We should divide ballon into a few groups with exactly two letters.But if the two letters are the same,a single x will be inserted between the same two letters.So “balloon” will be divided into “ba” “lx” “lo” “on”.

Finally,we will encrypt the message.The substitution rules are followed:

1.If the group’s two letters are in the same row in the key table,each letter will be changed into the letter which is just on the right of it.(the first column is seen as on the right of the fifth column).

2.If the group’s two letters are in the same column in the key table,each letter will be changed into the letter which is adjacently below it.(the first row is seen as adjacent below fifth column).

3.If the group’s two letters are neither in the same row nor in the same column in the key table,each letter will be changed into the letter whose position is the same row as itself and the same column as another letter.

So “balloon” will be changed into “cbsvbvpo”.

Ps: j in the plaintext is equal to i and all the letter both in plaintext and ciphertext should be lower letter.And if there are capital letters in the plaintext,change it into lower letters.

Input

The first line will contain the secret key(no more than 25 letters). Then you will get a article(including capital letter and the lower letter).You should omit all the spacing , the punctuation and the numbers(maybe has two or more rows).If there are odd letters after tidying plaintext,delete the last letter.The article would end with a ‘*’.

Ps:You can assume that the article is no more than 10000 letters.And “xx” won’t exist. And the secret key only contains lower letters.

Output

The ciphertext which only includes lower letters.

Sample input and output

Sample Input Sample Output
cipher
balloon
*
dbspgsug
cipher
fill book*
aespslsvqg

Source

第七届ACM趣味程序设计竞赛第四场(正式赛)
 
题解:(见百度百科==)给出一个key,是一个小于25个字母的字符串,然后将这个字符串中的重复字符去掉,横向填入一个5*5的格子里,格子中没填满的用26个字母中没用过的按字典序填入。由于字母有26个,格子是25个,所以字母i和j当做同一个字符处理,均用i表示。然后给出一段包含各种字符的字符串,需要提取其中的字母,字符串的结尾是‘*’。提取出的字母按顺序两两配对,如果两个字母相同,则在中间插入一个‘x’,前一个字母与‘x'配对,后一个字母与该字母的后一字母配对,如果仍相同,也这样处理(不会出现’xx‘这样的数据)。配对后,每两个字母到密码表中匹配,如果同行,则输出相应字母的右边的字母;如果同列,则输出相应字母的下面的字母(第一行为第五行下面,第一列为第五列右边);如果不同行部同列,输出两个字母构成的矩形的另外两个角上的字母(其实就是交换两者的Y坐标并输出)。
自己写的代码一直WA...==b,还没找出错误(结尾给出我的WA代码)...感谢YXT提供的AC代码.
 
#include <iostream>
#include<cstdio>
#include<cstring> using namespace std;
int len1,i,j,k,x1,x2,y1,y2;
int f[],mp[][],a[];
char ch1[]; int xt(char s)
{
if ((int)s>=) return (int)s-;
return (int)s-;
} void solve()
{
int i,j,f[];
len1=strlen(ch1);
j=;
i=;
memset(f,,sizeof(f));
for(int ii=; ii<len1; ii++)
{
int k=xt(ch1[ii]);
if (!f[k])
{
if (k== || k==)
if (f[]) continue;
else k=;
j++;
f[k]=;
mp[i][j]=k;
if (j==)
{
j=;
i++;
}
}
}
for(int ii=; ii<=; ii++)
if (!f[ii])
{
if (ii==) continue;
j++;
mp[i][j]=ii;
if (j==)
{
j=;
i++;
}
}
return;
} void findxy(int *x,int *y,int z)
{
int i,j;
for(i=; i<=; i++)
for(j=; j<=; j++)
if (mp[i][j]!=z) continue;
else
{
*x=i;
*y=j;
return;
}
} int main()
{
freopen("in.txt", "r", stdin);
while(~scanf("%s",&ch1))
{
solve(); memset(a,,sizeof(a));
while (~scanf("%s",&ch1))
{
len1=strlen(ch1);
for(i=; i<len1; i++)
{
if (ch1[i]=='*') goto mm;
if(!(ch1[i]>='a' && ch1[i]<='z' || ch1[i]>='A' && ch1[i]<='Z')) continue;
if (ch1[i]=='j' || ch1[i]=='J') ch1[i]='i';
a[++a[]]=xt(ch1[i]);
}
}
mm:
k=;
while(k<a[])
{
findxy(&x1,&y1,a[k]);
if (a[k+]==a[k]) findxy(&x2,&y2,);
else
{
k++;
findxy(&x2,&y2,a[k]);
} if (x1==x2 && y1!=y2) printf("%c%c",(char)(+mp[x1][y1%+]),(char)(+mp[x2][y2%+]) );
if (x1!=x2 && y1==y2) printf("%c%c",(char)(+mp[x1%+][y1]),(char)(+mp[x2%+][y2]) );
if (x1!=x2 && y1!=y2) printf("%c%c",(char)(+mp[x1][y2]),(char)(+mp[x2][y1]) );
k++;
}
printf("\n");
}
return ;
}
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#define PI 3.1415926
#define ms(a) memset(a,0,sizeof(a))
#define msp memset(mp,0,sizeof(mp))
#define msv memset(vis,0,sizeof(vis))
using namespace std;
#define LOCAL
char mp[][];
int cha[];
string key,line,art;
struct Node
{
char a,b;
};
void mpfill(int idx,char c)//填密码表
{
int i=idx/,j=idx%;
mp[i][j]=c;
return;
}
void mpmake()//生成密码表
{
ms(cha),msp,cha[]=;
int idx=;
string::iterator it;
for(it=key.begin(); it!=key.end(); it++)
{
if(isalpha(*it)==)continue;
*it=tolower(*it);
if(cha[*it-'a']==)
{
mpfill(idx++,*it);
cha[*it-'a']=;
}
}
for(int i=; i<; i++)
{
if(cha[i]==)
{
mpfill(idx++,i+'a');
cha[i]=;
}
}
}
void scanart()
{
line.clear(),art.clear();
while(cin>>line)
{
string::iterator it;
for(it=line.begin(); it!=line.end(); it++)
{
if(*it=='*')return;
if(isalpha(*it))
{
if(tolower(*it)=='j') art.push_back('i');
else art.push_back(tolower(*it));
}
}
}
}
void mpfind(int i1,int j1,int i2,int j2)
{
if(i1==i2)//同行
{
j1=(j1+)%,j2=(j2+)%;
printf("%c%c",mp[i1][j1],mp[i2][j2]);
return;
}
if(j1==j2)//同列
{
i1=(i1+)%,i2=(i2+)%;
printf("%c%c",mp[i1][j1],mp[i2][j2]);
return;
}
//不同行不同列
printf("%c%c",mp[i1][j2],mp[i2][j1]);
}
void scanmp(char c1,char c2)
{
int i1,i2,j1,j2;
for(int i=;i<;i++)
{
int x=i/,y=i%;
if(mp[x][y]==c1)i1=x,j1=y;
if(mp[x][y]==c2)i2=x,j2=y;
}
mpfind(i1,j1,i2,j2);
}
void change()
{
string::iterator it;
for(it=art.begin(); it!=art.end(); it++)
{
Node t;
if(it+==art.end())break;
if(*it!=*(it+))t.a=*it,t.b=*(it+),it++;
else t.a=*it,t.b='x';
scanmp(t.a,t.b);
}
printf("\n");
return;
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
ios::sync_with_stdio(false);
while(cin>>key)
{
mpmake();//密码表
scanart();//读取明文
change();//转换密文
}
return ;
}

CDOJ 1270 Playfair(模拟)的更多相关文章

  1. CDOJ 1270 Playfair

    模拟题,代码写得比较乱... #include<cstdio> #include<cstring> #include<cmath> #include<queu ...

  2. cdoj 25 点球大战(penalty) 模拟题

    点球大战(penalty) Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/2 ...

  3. CDOJ 3 BiliBili, ACFun… And More! 模拟

    原题链接:http://acm.uestc.edu.cn/#/problem/show/3 题意: 有个人在看B站视频时有个习惯,就是每当卡住的时候,他总再次从头开始看.另外,他在看视频时会先等待T的 ...

  4. 模拟一下goldengate中断后,重新同步操作

    模拟一下goldengata中断后,重新同步操作:     1.关掉源端抽取进程 GGSCI (20081122-2105) 15> info all Program     Status    ...

  5. App开发:模拟服务器数据接口 - MockApi

    为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...

  6. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  7. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  8. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

  9. 模拟AngularJS之依赖注入

    一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...

随机推荐

  1. Xcode打包framework脚本

    参考文章: http://www.jianshu.com/p/1cb4c4fe5481 https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79 ...

  2. [Jenkins]admin用户登陆,提示登陆无效(之前登陆OK,三天没有登陆,突然提示登陆无效,重启无法解决)的解决方法

    问题出现现象: 系统一直正常,突然某天登陆,提示用户无效,无法登陆成功. 问题分析过程: 1.查看日志:/var/log/jenkins/jenkins.log(通过ps -elf | grep je ...

  3. Java 多线程 笔记 转自http://www.cnblogs.com/lwbqqyumidi/p/3804883.html

    多线程作为Java中很重要的一个知识点, 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中 ...

  4. Java NIO 内存映射文件

    Java NIO 内存映射文件 @author ixenos 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基本的IO操作是直接调用native方法获得驱动和磁盘交互的,IO速度限制 ...

  5. NVIC

    1中断:每一个中断都会对应一个服务程序 2NVIC 他的做用是负责中断优先级管理 3IP bit[7:4]每一个中断都有一个IP寄存器,用于设置中断相关的属性 AIRCR[10:8]只一个AIRCR寄 ...

  6. sqlite导入后无法使用

    问题:sqlite导入后无法使用 解决方式:引入sqlite3 的libraries ,然后再在 projectName-Bridging-Header.h 中添加 #import "sql ...

  7. lucene 多字段查询-MultiFieldQueryParser

    /** * 搜索域加权 */ Map<String, Float> boosts = new HashMap<>(); boosts.put("title" ...

  8. jmeter下载及安装配置

    本文是在win7环境下安装使用jmeter,jmeter可以运行在多平台上Windows和Linux. 前提:使用jmeter工具之前需要安装java.并配置好java的环境变量.(备注:java下载 ...

  9. android的签名

    安装好了android studio,默认是使用期限为一年的签名,并且不可以发布到正式版的apk里. 在使用第三方模块或者服务的时候,经常要求提供签名及其sha1或者MD5信息. 事实上这个签名和及其 ...

  10. 如何阅读一本书([美] 莫提默·J. 艾德勒 / 查尔斯·范多伦 )

               进入豆瓣读书 前言 2017年1月2日跟着熊猫书院开始了为期十月的阅读计划. 熊猫书院是一个微信公众号,但仅对熊猫书院学员开放.它是一个很好的读书产品,从入学申请.入学报到.班长 ...