poj2159 Ancient Cipher

Ancient Cipher

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 29154   Accepted: 9547

Description

Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents were sent between provinces and the capital in encrypted form to prevent eavesdropping. The most popular ciphers in those
times were so called substitution cipher and permutation cipher.

Substitution cipher changes all occurrences of each letter to some other letter. Substitutes for all letters must be different. For some letters substitute letter may coincide with the original letter. For example, applying substitution cipher that changes
all letters from ‘A‘ to ‘Y‘ to the next ones in the alphabet, and changes ‘Z‘ to ‘A‘, to the message "VICTORIOUS" one gets the message "WJDUPSJPVT".

Permutation cipher applies some permutation to the letters of the message. For example, applying the permutation <2, 1, 5, 4, 3, 7, 6, 10, 9, 8> to the message "VICTORIOUS" one gets the message "IVOTCIRSUO".

It was quickly noticed that being applied separately, both substitution cipher and permutation cipher were rather weak. But when being combined, they were strong enough for those times. Thus, the most important messages were first encrypted using substitution
cipher, and then the result was encrypted using permutation cipher. Encrypting the message "VICTORIOUS" with the combination of the ciphers described above one gets the message "JWPUDJSTVP".

Archeologists have recently found the message engraved on a stone plate. At the first glance it seemed completely meaningless, so it was suggested that the message was encrypted with some substitution and permutation ciphers. They have conjectured the possible
text of the original message that was encrypted, and now they want to check their conjecture. They need a computer program to do it, so you have to write one.

Input

Input contains two lines. The first line contains the message engraved on the plate. Before encrypting, all spaces and punctuation marks were removed, so the encrypted message contains only capital letters of the English alphabet. The second line contains the
original message that is conjectured to be encrypted in the message on the first line. It also contains only capital letters of the English alphabet.

The lengths of both lines of the input are equal and do not exceed 100.

Output

Output "YES" if the message on the first line of the input file could be the result of encrypting the message on the second line, or "NO" in the other case.

Sample Input

JWPUDJSTVP
VICTORIOUS

Sample Output

YES

题意:给你两个字符串,问第一个能不能通过凯撒加密的逆过程得到得到第二个

解题思路:所谓的凯撒加密先是将先通过一个置换的过程将字符串重组,然后再让每个字符加上一个数变成另一个字符,

但是我们无法模拟这个过程,因为字符串的大小最大100,如果模拟大概有100!种情况,运行时间超过1s,

我们可以发现一个字符串相同的字符对应另一个字符串的字符也是相同的字符,因此,

如果一个字符串中某个字符的频率是n,那个在另一个字符串中某个字符的频率也是n,则这两个很有可能是相对应的,

所以我们可以找出字符中所有字符的频率,然后让字符的频率按顺序排列,同理另一个字符串做同样的操作,

如果他们排列的顺序是一样的,那么他们可以通过凯撒加密的逆过程进行变换。

参考代码:

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int main(){
	char x[102],y[102];
	int a[26],b[26];
	while (cin>>x>>y){
		int len_x=strlen(x),len_y=strlen(y),flag=0;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for (int i=0;i<len_x;i++)
			a[x[i]-'A']++;
		for (int i=0;i<len_y;i++)
			b[y[i]-'A']++;
		sort(a,a+26);
		sort(b,b+26);
		for (int i=0;i<26;i++){
			if (a[i]!=b[i]){
				cout<<"NO"<<endl;
				flag=1;
				break;
			}
		}
		if (flag==0)
			cout<<"YES"<<endl;
	}
	return 0;
}
时间: 2024-08-06 21:39:29

poj2159 Ancient Cipher的相关文章

POJ2159 Ancient Cipher【字符密码】

题目链接: http://poj.org/problem?id=2159 题目大意: 古罗马帝王的保密服务部门的保密方法是替换和重新排列. 替换方法是将出现的字符替换成其他的字符.如将'A'替换成'Z',将'Z'替换成'A'. 排列方法是改变原来单词中字母的顺序.例如将顺序变为<2,1,5,4,3,7,6,10,9,8>.应用到字符串 "VICTORIOUS"上,则可以得到"IVOTCIRSUO". 单用一种解密方法是不安全的,只有将两种方法结合起来才安

UVA1339 UVALive3213 POJ2159 ZOJ2658 Ancient Cipher

Regionals 2004 >> Europe - Northeastern 问题链接:UVA1339 UVALive3213 POJ2159 ZOJ2658 Ancient Cipher.基础训练题,用C语言编写程序. 对两组字符串分别进行字母统计,接着对统计结果进行排序,然后对排序后的结果进行比较.如果相同,说明可以找到一种一一映射,使得两个字符串相同. AC的C语言程序如下: /* UVA1339 UVALive3213 POJ2159 ZOJ2658 Ancient Cipher *

poj 2159 D - Ancient Cipher 文件加密

Ancient Cipher Description Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents were sent between provinces and the capital in encrypted form to prevent eavesdropping

uva--1339 - Ancient Cipher(模拟水体系列)

1339 - Ancient Cipher Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents were sent between provinces and the capital in encrypted form to prevent eavesdropping. The

UVa 1339 Ancient Cipher --- 水题

UVa 1339 题目大意:给定两个长度相同且不超过100个字符的字符串,判断能否把其中一个字符串重排后,然后对26个字母一一做一个映射,使得两个字符串相同 解题思路:字母可以重排,那么次序便不重要,可以分别统计两个字符串中的各个字母出现的次数,得到两个cnt[26]数组, 又由于可以进行映射,则可以直接对两个数组进行排序后判断是否相等(相当于原来相等的值的两个地方做映射) /* UVa 1339 Ancient Cipher --- 水题 */ #include <cstdio> #incl

poj 2159 Ancient Cipher(水)

Ancient Cipher Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30695   Accepted: 10023 Description Ancient Roman empire had a strong government system with various departments, including a secret service department. Important documents w

UVa 1339 Ancient Cipher【排序】

/* 中文题目      古老的密码 中文翻译-大意  给你两个字符串,看你能不能将第一个字符变化位置(重排),变成和第二个字符串的26个字母一一对应. 解题思路:将两个字符串的各个字符的数量统计出来,如果各个字符串的数量都是一样的,那么就输出yes,否则输出no 难点详解:在统计每个字符出现的次数有点小难度 关键点:排序 解题人:lingnichong 解题时间:2014/08/26    00:36 解题体会:很好的一题 */ 1339 - Ancient Cipher Time limit

UVa1399.Ancient Cipher

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4085 13855995 1339 Ancient Cipher Accepted C++ 0.012 2014-07-09 12:35:33 Ancient Cipher Ancient Roman empire had a strong government system wit

Poj 2159 / OpenJudge 2159 Ancient Cipher

1.链接地址: http://poj.org/problem?id=2159 http://bailian.openjudge.cn/practice/2159 2.题目: Ancient Cipher Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28064   Accepted: 9195 Description Ancient Roman empire had a strong government system