// File: main.cpp #include #include #include #include using namespace std; void solve() { string S, T; cin >> S >> T; int n = static_cast(S.size()); array, 2> cntS{}, cntT{}; for (int i = 0; i < n; ++i) { cntS[i & 1][S[i] - 'a']++; cntT[i & 1][T[i] - 'a']++; } // 1. 偶奇それぞれの多重集合が一致するか確認 if (cntS != cntT) { cout << "No\n"; return; } // 2. 重複する文字が1つでも存在すれば、パリティを自由に変えられるため常に Yes for (int p = 0; p < 2; ++p) { for (int c = 0; c < 26; ++c) { if (cntS[p][c] >= 2) { cout << "Yes\n"; return; } } } // ここに到達した時点で、各列の文字はすべて異なるため n <= 52 が保証される auto get_inversion_parity = [&](const string& X, int start_idx) -> int { int parity = 0; for (int i = start_idx; i < n; i += 2) { for (int j = i + 2; j < n; j += 2) { if (X[i] > X[j]) { parity ^= 1; } } } return parity; }; int diff_even = get_inversion_parity(S, 0) ^ get_inversion_parity(T, 0); int diff_odd = get_inversion_parity(S, 1) ^ get_inversion_parity(T, 1); if (diff_even == diff_odd) { cout << "Yes\n"; } else { cout << "No\n"; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; if (cin >> Q) { while (Q--) { solve(); } } return 0; }