2159:Ancient Cipher

keyword

暗号 C++

概要

平文が文字の置換->順序の置換で暗号化される。文字列が2つ与えられ、一方がもう一方の暗号文である可能性の有無を調べる問題。
文字の置換ではヒストグラムは変わらないので2つのヒストグラムが順序を入れ替えたものかどうかを判定すれば良い。つまりmultisetの出番なわけで。

int main(){
    char str1[102], str2[102];
    scanf("%s\n%s\n",str1, str2);
    int i;
    multiset<int> a1, a2;
    map<char, int> d1, d2;
    REP(i,strlen(str1)){
        d1[str1[i]]++;
    }
    REP(i,strlen(str2)){
        d2[str2[i]]++;
    }
    EACH(d1,it){
        a1.insert(it->second);
    }
    EACH(d2,it){
        a2.insert(it->second);
    }
    if(a1 == a2){
        printf("YES\n");
    }
    else{
        printf("NO\n");
    }
    return 0;
}