poj 2159 Ancient Cipher
2012-05-01 23:49
399 查看
/*完全没有看懂题意,题目需要求的是:(粘贴别人的题意)这道题如果没看懂题意,绝对不是水题,能愁死你,而如果看懂了的话,的确稍微有点小水。 关键是对代替加密和置换加密的理解,题目中给出的例子容易误导你进入误区: 代替加密是按照一定规律来的。所以你会很容易的想到先排序,找两个字符串的差距,如果一样就YES了。。 其实,代替加密没有“规律”!A可以对应任意的26个字母。 不知道说明白了没有 所以 是否相同的标准就是 1 两个字符串初始长度是否相同 2. 频率分布是否相同(不管哪个字母的频率,只要频率从小到大排列出来,两个字符串完全相同就可以) 举个例子: abbccc mqqbbb YES 频率都是 1 2 3 aabbcc mnnjjj NO 频率分别为 2 2 2和 1 2 3 好了,大体上就这样 */ //在看别人的题意之后,自己写的代码如下: #include "iostream" #include "string" #include "algorithm" #include "map" using namespace std; map<char, int> m; int main() { int len1, len2, i; char ch = 'A'; string str1, str2, ans1, ans2; cin >> str1 >> str2; len1 = str1.length(); len2 = str2.length(); if (len1 != len2) cout << "NO" << endl; else { sort(str1.begin(), str1.end()); sort(str2.begin(), str2.end()); for (i = 0; i < 26; i++) m['A'+i] = 0; for (i = 0; i < len1; i++) m[str1[i]]++; for (i = 0; i < 26; i++) { if (m['A'+i] != 0) ans1.push_back(m['A'+i]+48); } for (i = 0; i < 26; i++) m['A'+i] = 0; for (i = 0; i < len1; i++) m[str2[i]]++; for (i = 0; i < 26; i++) { if (m['A'+i] != 0) ans2.push_back(m['A'+i]+48); } sort(ans1.begin(), ans1.end()); sort(ans2.begin(), ans2.end()); if (ans1 == ans2) cout << "YES" << endl; else cout << "NO" << endl; } //system("pause"); }
相关文章推荐
- poj 2159 Ancient Cipher
- POJ 2159 Ancient Cipher
- poj-2159-Ancient Cipher
- poj - 2159 - Ancient Cipher(统计)
- Poj 2159 / OpenJudge 2159 Ancient Cipher
- POJ 2159 Ancient Cipher
- poj 2159 Ancient Cipher
- POJ-2159-Ancient Cipher
- POJ 2159 Ancient Cipher
- Ancient Cipher--POJ 2159
- 【原】 POJ 2159 Ancient Cipher 题意万岁 解题报告
- POJ 2159 Ancient Cipher 解题报告
- POJ 2159 Ancient Cipher
- poj 2159 Ancient Cipher
- POJ 2159 Ancient Cipher
- Poj 2159 / OpenJudge 2159 Ancient Cipher
- poj 2159 Ancient Cipher 古老的密码
- POJ 2159 Ancient Cipher
- POJ 2159 Ancient Cipher(字符频率统计)
- POJ 2159 Ancient Cipher