ABC110 C問題
問題概要
英小文字のみからなる文字列 \(S, T\) が与えられる。
文字列 \(S\) に対して、次の操作を何度でも行うことができる。
- 2つの異なる英小文字 \(c_1, c_2\) を選び、\(S\) に含まれる全ての\(c_1\) を\(c_2\)に、\(c_2\) を\(c_1\)に置き換える
0回以上この操作を行って、\(S\)を\(T\)と一致させられるかを判定せよ。
制約
- 1 ≤ \(|S|\) ≤ 2 \(\times\) 105
- \(|S| = |T|\)
- S, Tは英小文字のみからなる。
考えたこと
- alphabet のどの文字がどの文字に変換されるかという変換表を用意する
- 変換表が埋まっていない時には、変換表を埋める
- 変換表が埋まっていて、行き先が前の場合と今回の場合で異なっている時には失敗
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string S, T; cin >> S >> T; vector<int> start(26, -1); // -1 で埋めるように初期化 vector<int> goal(26, -1); for(int i = 0; i < S.size(); i++) { int a = S[i] - 'a'; // char から int に変換 int b = T[i] - 'a'; if(start[a] != -1 || goal[b] != -1) { if(start[a] != b || goal[b] != a) { cout << "No" << endl; return 0; } } else { start[a] = b; goal[b] = a; } } cout << "Yes" << endl; return 0; }