思維-POJ 2159-Ancient Cipher
阿新 • • 發佈:2018-11-19
-
思維-POJ 2159-Ancient Cipher
-
題目連結:
Ancient Cipher
-
思路:
題目大意:
給出兩種對檔案加密的方式,替換和重新排列
替換:例如:替換規則可以是將'A' 到 'Y'替換成它的下一個字元,將'Z'替換成 'A',如果原詞是 "VICTORIOUS" 則它變成 "WJDUPSJPVT"
重新排列:排列方法改變原來單詞中字母的順序。例如:將順序<2, 8="">應用到 "VICTORIOUS" 上,則得到"IVOTCIRSUO"
給定兩個字串,如果第二個字串通過加密能得到第一個字串,輸出YES
題解:
看清楚,對於替換和重新排列,題目並沒有給具體規則,所有註定這道題考的是思維
先看替換,替換後,改變的是字元,但替換前後,這種字元的數量沒有改變(替換是將字串中所有該字元替換成另外一個字元),並且,字串中字元的種類還是那麼多
再看重新排列:改變的是字元的相對位置,字元的種類以及相應數量沒有改變
綜上,對兩個字串的字元種類和數量進行統計,如果字串中的種類和數量相同,說明可以轉換
-
程式碼:
#include<iostream> #include<algorithm> #include<string> using namespace std; int Vis1[26] = { 0 }; int Vis2[26] = { 0 }; int main() { string str1, str2; cin >> str1 >> str2; int len1 = str1.length(); int len2 = str2.length(); if (len1 != len2) cout << "NO" << endl; else { for (int i = 0; i < len1; i++) { Vis1[str1[i] - 'A']++; Vis2[str2[i] - 'A']++; } sort(Vis1, Vis1 + 26); sort(Vis2, Vis2 + 26); for (int i = 0; i < 26; i++) { if (Vis1[i] != Vis2[i]) { cout << "NO" << endl; return 0; } } cout << "YES" << endl; return 0; } }