POJ 2159 Ancient Cipher雑題


題意:str 1,str 2が与えられ、str 2が暗号化されるとstr 1になる.出力YES,そうでなければ出力NO.暗号化方式は2種類あり,1つは文字を変えること,1つは順序を変えることである.問題解:この問題はやはりしばらく遅れた.最初は問題の意味を間違って理解し、substitution cipher(置換パスワード):辞書順に任意の位置をオフセットするようにします.だからずっとWR.
他の人の説明を見ました.
「substitution cipher(置換パスワード):
Substitution cipher changes all occurrences of each letter to some other letter. Substitutes for all letters must be different.For some letters substitute letter may coincide with the original letter. For example, applying substitution cipher that changes all letters from 'A' to 'Y' to the next ones in the alphabet, and changes 'Z' to 'A', to the message "VICTORIOUS"one gets the message "WJDUPSJPVT".
「シフト」は、「Substitutes for all letters must be different.」置換されています
A->B
C->H
Z->D
この問題についてinput:
AAABB CCCEE
ひずみしゅつりょく
YES
だから、明文と密文の「アルファベット周波数の配列」は同じであるべきで、つまり明文の中のあるアルファベットが8回現れ、密文の中にもあるアルファベットが8回現れなければならない.
だからアルファベットの種類、アルファベットの周波数が同時に等しい場合、解読されます.
permutation cipher(パスワードの配列):
Permutation cipher applies some permutation to the letters of the message. For example, applying the permutation <2, 1, 5, 4, 3, 7, 6, 10, 9, 8> to the message "VICTORIOUS"one gets the message "IVOTCIRSUO".
明文はランダムに並べられているので、アルファベットの種類も頻度も変わりません.
この問題に対して、パスワードを並べて考えるか、考えないかは問題を解くのに影響しません!」
#include <cstring>
#include <iostream>
using namespace std;

char first[101],second[101];
int frequency[2][30];

int main()
{
	cin >> first >> second;
	int i, j, counter;
	int len = strlen(first);

	for ( i = 0; i < len; i++ )
	{
		frequency[0][first[i]-'A']++;
		frequency[1][second[i]-'A']++;
	}

	for ( i = 0; i < 26; i++ )
	{
		for ( j = 0; j < 26; j++ )
		{
			if ( frequency[0][i] == frequency[1][j] )
			{
				frequency[1][j] = -1; /*  frequency[1][j]        ,      -1 */
				break;
			}
		}
		if ( j==26 ) break;
	}

	if ( i==26 )
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
	return 0;
}