#include using namespace std; bool can_transform(const string& s, const string& t) { const int n = static_cast(s.size()); int count_s[2][26] = {}; int count_t[2][26] = {}; int position_t[2][26] = {}; for (int i = 0; i < n; ++i) { const int parity = i & 1; const int a = s[i] - 'a'; const int b = t[i] - 'a'; ++count_s[parity][a]; ++count_t[parity][b]; position_t[parity][b] = i; } bool has_duplicate = false; for (int parity = 0; parity < 2; ++parity) { for (int c = 0; c < 26; ++c) { if (count_s[parity][c] != count_t[parity][c]) { return false; } if (count_s[parity][c] >= 2) { has_duplicate = true; } } } // 同じ位置偶奇の中に重複があれば、対応づけで偶奇を調整できる。 if (has_duplicate) { return true; } // 重複なしなので、各文字の移動先が一意に決まる。 // この分岐に入る場合、n <= 52。 vector permutation(n); for (int i = 0; i < n; ++i) { permutation[i] = position_t[i & 1][s[i] - 'a']; } // 固定点を含めて巡回の個数を数える。 vector visited(n, false); int cycle_count = 0; for (int i = 0; i < n; ++i) { if (visited[i]) { continue; } ++cycle_count; int v = i; while (!visited[v]) { visited[v] = true; v = permutation[v]; } } return (n - cycle_count) % 2 == 0; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int q; cin >> q; while (q--) { string s, t; cin >> s >> t; cout << (can_transform(s, t) ? "Yes" : "No") << '\n'; } return 0; }