解説がよく分からなかったので自分なりの考えと解法を載せます(本質的には変わらないと思います)。
問題の操作の内容としては、アルファベット1をアルファベット2と交換するというものです。ここで注目するのは全てのアルファベット1とアルファベット2を置き換えるということです。そのためS=aa
とT=ab
の組み合わせは成り立ちません。なぜかというとaa
という部分はどうあがいても同じアルファベットにしか置き換えられないからです。逆に見ても同じで、b
をa
に置換しようとすると、ba
という並びになるため、ab
はaa
になりえません。
どういう場合に置換が可能かと言うと、文字列内にaからzまでのアルファベットが1種類につき何文字入っているかという表を作ったときに、この表(対応表)が完全一致するときに置換が可能です。
入力例1の場合ではSの対応表が以下のようになります。
アルファベット | 個数 |
---|---|
a | 1 |
z | 2 |
e | 1 |
l | 1 |
一方Tでは以下のようになります。
アルファベット | 個数 |
---|---|
a | 1 |
p | 2 |
l | 1 |
e | 1 |
この場合であれば、z
をp
に置き換え、l
とe
を置き換えればいいとひと目で分かります。
つまりこの表の右1列が一致するときに、置換が可能です。左のアルファベットは置き換えられるため関係ありません。
自分が参加しなかったコンテストのC問に限ってすぐ解けるのは辛い・・・
#include <bits/stdc++.h> using namespace std; int main(){ string s,t; cin>>s>>t; vector<int> c1(26,0),c2(26,0); for(int i = 0; i < s.size(); i++){ c1[s[i]-'a']++; c2[t[i]-'a']++; } sort(c1.begin(),c1.end()); sort(c2.begin(),c2.end()); if(c1==c2) cout<<"Yes"; else cout<<"No"; }