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 C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <stdio.h>
#include <math.h> 
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <string>
#include <numeric>
#include <bitset>
#include <queue>
#include <map>

using namespace std;


int main() {
	/*
	①同じ文字が異なる文字に変換された。(a->b,a->c)  例:aab&cdd
	②異なる文字が同じ文字に変換された。(b->a,c->a) こっちはOK 例：chokudai&redcoder
	の一つでも該当したらNo
	*/

	//input
	string S, T;
	cin >> S >> T;

	map<char, char> st,ts;
	int ans_st = 0;

	//①ここを高速化したい
	int time_cnt = 0;
	for (int i = 0; i < S.size(); ++i) {
		char tmp = T[i];
		for (int j = i + 1; j < S.size(); ++j) {
			time_cnt++;
			if (time_cnt > 100000) {
				break;
			}
			if (S[i] == S[j]) {
				char tmp2 = T[j];
				if (tmp != tmp2) {
					ans_st = 1;
					cout << "No" << endl;
					return 0;
				}
			}
		}
	}

	//S,Tの同じ番目のmapをつくる
	for (int i = 0; i < S.size(); ++i) {
		char s = S[i];
		char t = T[i];

		st.insert(make_pair(s, t));
		ts.insert(make_pair(t, s));
	}

	//Sの重複の削除
	sort(S.begin(), S.end());
	S.erase(unique(S.begin(), S.end()), S.end());

	//stのキーをvectorに格納する
	

	//st[S[i]]をvecに格納する(Tに重複があるとき)
	vector<char> vec;
	for (int i = 0; i < st.size(); ++i) {
		vec.push_back(st[S[i]]);
	}
	//②vecに同じ文字があったら一つの文字が二つの変換先を持つということになるのでフラグを立てる
	for (int i = 0; i < vec.size(); ++i) {
		for (int j = i+1; j < vec.size(); ++j) {
			if (vec[i] == vec[j]) {
				ans_st = 1;
				cout << "No" << endl;
				return 0;
			}
		}
	}

	//Tの重複の削除
	sort(T.begin(), T.end());
	T.erase(unique(T.begin(), T.end()), T.end());

	//st[T[i]]をvecに格納する(Sに重複があるとき)
	vector<char> vec2;
	for (int i = 0; i < ts.size(); ++i) {
		vec2.push_back(ts[T[i]]);
	}
	//②vecに同じ文字があったら一つの文字が二つの変換先を持つということになるのでフラグを立てる
	for (int i = 0; i < vec2.size(); ++i) {
		for (int j = i + 1; j < vec2.size(); ++j) {
			if (vec2[i] == vec2[j]) {
				ans_st = 1;
				cout << "No" << endl;
				return 0;
			}
		}
	}

	if (ans_st == 0) cout << "Yes" << endl;
	else cout << "No" << endl;

	return 0;
}