UVA - 1339 Ancient Cipher

Description

Ancient Roman empirehad a strong government system with various departments, includinga secret service department. Important documents were sent betweenprovinces and the capital in encrypted form to preventeavesdropping. The most popular ciphers in those times were socalled substitution cipher and permutation cipher.
Substitution cipher changes all occurrences of each letter to someother letter. Substitutes for all letters must be different. Forsome letters substitute letter may coincide with the originalletter. For example, applying substitution cipher that changes allletters from 'A' to 'Y' to the next ones in the alphabet, andchanges 'Z' to 'A', to the message "VICTORIOUS" one gets themessage "WJDUPSJPVT".
Permutation cipher applies some permutation to the letters of themessage. 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, bothsubstitution cipher and permutation cipher were rather weak. Butwhen being combined, they were strong enough for those times. Thus,the most important messages were first encrypted using substitutioncipher, and then the result was encrypted using permutation cipher.Encrypting the message "VICTORIOUS" with the combination of theciphers described above one gets the message "JWPUDJSTVP".
Archeologists have recently found the message engraved on a stoneplate. At the first glance it seemed completely meaningless, so itwas suggested that the message was encrypted with some substitutionand permutation ciphers. They have conjectured the possible text ofthe original message that was encrypted, and now they want to checktheir conjecture. They need a computer program to do it, so youhave to write one.

Input

Input contains twolines. 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 theEnglish alphabet. The second line contains the original messagethat is conjectured to be encrypted in the message on the firstline. It also contains only capital letters of the Englishalphabet.
The lengths of both lines of the input are equal and do not exceed100.

Output

Output "YES" if themessage on the first line of the input file could be the result ofencrypting the message on the second line, or "NO" in the othercase.

Sample Input

JWPUDJSTVP
VICTORIOUS

Sample Output

YES


分析:本题直接对字符串进行字符统计,对统计的结果排序,如果排序结果一样则可以。


#include <stdio.h>
#include <algorithm>
#include <string.h>

const int maxn = 110;
char s1[maxn];
char s2[maxn];
int c1[26];
int c2[26];

bool cmp(int a,int b)
{
	return a<b;
}

int main()
{
	while(~scanf("%s%s",s1,s2))
	{
		int error = 0;
		int len = strlen(s1);
		memset(c1,0,sizeof(c1));
		memset(c2,0,sizeof(c2));
		for(int i=0; i<len; i++)
		{
			c1[s1[i]-'A']++;
			c2[s2[i]-'A']++;
		}
		std::sort(c1,c1+26,cmp);
		std::sort(c2,c2+26,cmp);
		for(int i=0; i<26; i++)
		{
			if(c1[i] != c2[i]) {error=1;break;}
		}
		if(error)printf("NO\n");
		else printf("YES\n");
	}
    return 0;
}


古老的密码,也称为古典加密技术,常指一些早期使用的编码方式,如凯撒密码、维吉尔密码(Vigenère cipher)等。在C++编程中,解决这类题目的常见步骤包括: 1. **了解加密算法**:首先要熟悉所涉及的密码学原理,比如凯撒密码是通过将字母表移动固定位数来加密,而维吉尔密码则是通过多次应用简单的替换规则。 2. **设计解密函数**:编写函数来读取加密后的文本,并按照特定的规则将其解码回原始信息。例如,对于凯撒密码,只需遍历字母表并把每个字符向左或右移动固定次数即可。 3. **输入处理**:接收用户输入的加密文本和密钥(如果需要),确保它们在解密过程中正确应用。 4. **测试和优化**:编写测试案例来验证解密函数是否能准确还原出原文,同时可以考虑性能优化,比如预计算字母表的移位。 下面是一个简单的凯撒密码解密示例(假设加密位数已知): ```cpp #include <iostream> #include <cctype> std::string caesarCipherDecipher(const std::string& encryptedText, int shift) { std::string decryptedText = ""; for (char c : encryptedText) { if (isalpha(c)) { // 检查是否为字母 char lowerCaseChar = tolower(c); // 转换为小写字母以便统一处理大小写 decryptedText += static_cast<char>((lowerCaseChar - 'a' - shift + 26) % 26 + 'a'); } else { decryptedText += c; // 非字母字符保持不变 } } return decryptedText; } int main() { std::string inputEncryptedText; int shiftAmount; std::cout << "Enter the encrypted text and shift amount: "; std::getline(std::cin, inputEncryptedText); std::cin >> shiftAmount; std::string decryptedText = caesarCipherDecipher(inputEncryptedText, shiftAmount); std::cout << "Decrypted text: " << decryptedText << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值