1. 程式人生 > >思維-POJ 2159-Ancient Cipher

思維-POJ 2159-Ancient Cipher

  • 思維-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;
	}
}