Problem:
Score : 300 points

Problem Statement

You are given strings S and T consisting of lowercase English letters.

You can perform the following operation on S any number of times:

Operation: Choose two distinct lowercase English letters c_1 and c_2, then replace every occurrence of c_1 with c_2, and every occurrence of c_2 with c_1.

Determine if S and T can be made equal by performing the operation zero or more times.

Constraints

1 \leq |S| \leq 2 \times 10^5

|S| = |T|

S and T consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

S
T

Output

If S and T can be made equal, print Yes; otherwise, print No.

Sample Input 1

azzel
apple

Sample Output 1

Yes

azzel can be changed to apple, as follows:

Choose e as c_1 and l as c_2. azzel becomes azzle.

Choose z as c_1 and p as c_2. azzle becomes apple.

Sample Input 2

chokudai
redcoder

Sample Output 2

No

No sequences of operation can change chokudai to redcoder.

Sample Input 3

abcdefghijklmnopqrstuvwxyz
ibyhqfrekavclxjstdwgpzmonu

Sample Output 3

Yes

Solution in JavaScript (node.js v5.12) (judge verdict: Wrong Answer)

var input = require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");
var obj = {
  "list" : input,
  "index" : 0,
  "max" : input.length,
  "next" : function(){
    if(!this.hasNext()){throw "NoSuchElementException:次に要素は無いよ";}
    var returnObj = this.list[this.index];
    this.index++;
    return returnObj;
  },
  "hasNext" : function(){return (this.index < this.max);}
}
Main();
function next(){return obj.next();}
function hasNext(){return obj.hasNext();}
function myout(t){console.log(t);}//standard output
function myerr(t){console.error(t);}//standard error
//[no]要素の扱い。数値型
//不明値、異常時:引数そのまま返す　1:数値へ変換
//2:半角SPで分割 4:半角SPで分割し、数値配列へ
//6:1文字で分割  7:1文字で分割し、数値配列へ
//8:半角SPで結合 9:改行で結合 0:文字なしで結合
function myconv(i,no){try{switch(no){case 1:return parseInt(i);case 2:return i.split(" ");case 4:return i.split(" ").map((a)=>Number(a));case 6:return i.split("");case 7:return i.split("").map((a)=>Number(a));case 8:return i.join(" ");case 9:return i.join("\n");case 0:return i.join("");default:return i;}}catch(e){return i;}}
function Main(){
  var s = myconv(next(),6);
  var len = s.length;
  var t = myconv(next(),6);
  var used = {};
  for(var i = 0; i < len; i++){
    if(used[s[i]] == null){
       used[s[i]] = new Set([i]);
    }else{
       used[s[i]].add(i);
    }
  }
  for(var i = 0; i < len; i++){
    if(t[i] == s[i]){continue;}
    if(used[t[i]] == null){
      used[t[i]] = used[s[i]];
      delete used[s[i]];
    }else{
      if(!used[t[i]].has(i)){
        var tmp = used[t[i]];
      	used[t[i]] = used[s[i]];
        used[s[i]] = tmp;
      }
    }
    
      var sKeys = Object.keys(used);
      var check = new Array(len);
      for(var j = 0; j < sKeys.length; j++){
        if(used[sKeys[j]] != null){
          var sCounts = Array.from(used[sKeys[j]]);
          for(var k = 0; k < sCounts.length; k++){
            check[sCounts[k]] = sKeys[j];
          }
        }
      }
      myerr(myconv(check,0));
    if(i == len - 1){
       if(myconv(t,0) == myconv(check,0)){
          myout("Yes");
       }else{
          myout("No");
       }
    }
  }
}