CDOJ 1270 Playfair(模拟)
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 |
dbspgsug |
cipher |
aespslsvqg |
Source
#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(模拟)的更多相关文章
- CDOJ 1270 Playfair
模拟题,代码写得比较乱... #include<cstdio> #include<cstring> #include<cmath> #include<queu ...
- cdoj 25 点球大战(penalty) 模拟题
点球大战(penalty) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/2 ...
- CDOJ 3 BiliBili, ACFun… And More! 模拟
原题链接:http://acm.uestc.edu.cn/#/problem/show/3 题意: 有个人在看B站视频时有个习惯,就是每当卡住的时候,他总再次从头开始看.另外,他在看视频时会先等待T的 ...
- 模拟一下goldengate中断后,重新同步操作
模拟一下goldengata中断后,重新同步操作: 1.关掉源端抽取进程 GGSCI (20081122-2105) 15> info all Program Status ...
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- HTML 事件(四) 模拟事件操作
本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4. ...
- 模拟AngularJS之依赖注入
一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...
随机推荐
- Latex—IEEE Latex模板 期刊名带下划线的问题解决
其实期刊名应该是斜体字的,但是有可能默认模板会导致斜体变下划线的问题,解决方法如下 引用包: \usepackage{ulem} %to strike the words 然后再在: \bibliog ...
- DUIlib使用Fastreport--自定义的数据
报表根据数据源的可以分为拉模式和推模式,拉模式就是在报表中添加数据源组件从数据库中拉取数据,我们上篇报表的简单使用就是拉模式.而推模式就是在程序中构造数据托给报表显示.这篇我们这要说的是推模式. 在程 ...
- CodeForces 709C Letters Cyclic Shift
贪心. 肯定是两个$a$之间的那些字符都$-1$,没有$a$就全部$-1$.如果输入的串全是$a$,那么把最后一个$a$改成$z$. #pragma comment(linker, "/ST ...
- 一步步优化JVM二:JVM部署模型和JVM Runtime
选择JVM部署模型 JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就 ...
- contentType设置类型导致ajax post data 获取不到数据
ajax post data 获取不到数据,注意 content-type的设置 .post/get关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的. 好吧今天我也遇到了, ...
- 防范CSRF(一)
CSRF是跨网站伪造请求的缩写.大致的攻击流程是,黑客获得浏览器向服务器发送的请求,然后对请求进行修改,让服务器执行指定的操作. 防范方式可以使用微软提供的解决方案. View放置Html.AntiF ...
- 高一的我曾对自己说"要放慢脚步去生活"!?
看了高一的时候自己写的日记,瞬间被自己感动到了.以下是当时的几段感慨: 慢是一种放松.是生活的一种良好心态,喜欢这样放慢步伐地生活,那是一种享受! 但我们生活在一个快节奏的时代,我们总是被迫卷进那潮流 ...
- MVC视图路径修改方法
http://wenku.baidu.com/link?url=MwAaKgGevU7hfRuTyCL95ZbJuDsNc4b__jEWisY9GuzAJzEUgEdoj7uQ-wurbYtz1IQj ...
- drupal7 boost模块为登录用户提供缓存
这段时间研究Drupal7的缓存相关,看了好多资料,都提到了boost和authcache两个模块,今天来说一下boost. 具体的下载安装,配置等,官网写的听清楚,boost模块地址 ,安装配置方法 ...
- C#读取Excel的其中一种方式OleDb读取(100万条)--快速大量插入SQL中
主要运用表类型 Create table BulkTestTable( Id nvarchar(), UserName nvarchar(), Pwd nvarchar() ) Go CREATE T ...