破译。字符串匹配。HOJ1548 Crypt Kicker II。
用两个map实现一一对应的判定。
| Time limit: | 1sec. | Submitted: | 122 |
| Memory limit: | 32M | Accepted: | 33 |
A common but insecure method of encrypting text is to permute the letters of the
alphabet. That is, in the text, each letter of the alphabet is consistently replaced
by some other letter. So as to ensure that the encryption is reversible, no two
letters are replaced by the same letter.
A common method of cryptanalysis is the known plaintext attack. In a known plaintext
attack, the cryptanalist manages to have a known phrase or sentence encrypted
by the enemy, and by observing the encrypted text then deduces the method of encoding.
Your task is to decrypt several encrypted lines of text, assuming that each line uses the same set of replacements, and that one of the lines of input is the encrypted form of the plaintext
the quick brown fox jumps over the lazy dog
Input
The input consists of several lines of input. Each line is encrypted as described above. Subsequent test cases are separated with a single blank line.
Output
Decrypt each line and print it to standard output. If there is more than one possible decryption, any one will do. If decryption is impossible, output a single line:
No solution.
The encrypted lines contain only lower case letters and spaces and do not exceed 80 characters in length. There are at most 100 input lines.
Separate output for subsequent cases with a single blank line.
Sample Input
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 xnmqSample Output
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
说明:
每组case给出几行text。 某一行与"the quick brown fox jumps over the lazy dog" 字母一一对应。
找出来并将其余行破译。
用两个map分别建立 上述text与可能与之一一对应行之间的对应。
用来判断是否有一个字母对应了两个或者两个不同的字母对应同一个的非法情况。
代码如下:#include<iostream>
#include<stdio.h>
#include<vector>
#include <map>
using namespace std;
int main() {
int t = 0;
vector<string> a;
string tmp;
string sta = "the quick brown fox jumps over the lazy dog";
while (getline(cin, tmp)) {
if (t)cout << endl;
t++;
a.clear();
map<char, char> m, opm;
bool flag2 = 1;
do {
a.push_back(tmp);
if (tmp.length() == sta.length() && flag2) {
m.clear();
opm.clear();
bool flag = 1;
for (int i = 0; i < tmp.length(); i++) {
if (sta[i] == ' ' && tmp[i] != ' ') {
flag = 0;
break;
}
}
if (flag) {
bool flag3 = 1;
for (int i = 0; i < tmp.length(); i++) {
if (m.find(tmp[i]) != m.end()) {
if (m[tmp[i]] != sta[i]) {
flag3 = 0;
break;
}
} else if (opm.find(sta[i]) != opm.end()) {
if (opm[sta[i]] != tmp[i]) {
flag3 = 0;
break;
}
} else {
m[tmp[i]] = sta[i];
opm[sta[i]] = tmp[i];
}
}
if (flag3)
flag2 = 0;
}
}
} while (getline(cin, tmp) && tmp != "");
if (flag2) {
cout << "No solution.\n";
continue;
}
for (int i = 0; i < a.size(); i++) {
for (int j = 0; j < a[i].length(); j++)
putchar(m[a[i][j]]);
cout << endl;
}
}
return 0;
}

浙公网安备 33010602011771号