#include using namespace std; vector count_all(const string& s) { vector cnt(3, 0); // d, o, g for (char c : s) { if (c == 'd') cnt[0]++; else if (c == 'o') cnt[1]++; else cnt[2]++; } return cnt; } // 嘘の「構造」: // o が 3 個以上連続している部分を壁として、 // 壁の長さと、壁で区切られた各区間の d/g 個数を見る。 vector> fake_signature(const string& s) { vector> sig; int n = (int)s.size(); int i = 0; // 現在の区間に含まれる d/g の個数 int dcnt = 0; int gcnt = 0; while (i < n) { if (s[i] != 'o') { if (s[i] == 'd') dcnt++; else if (s[i] == 'g') gcnt++; i++; continue; } int j = i; while (j < n && s[j] == 'o') j++; int len = j - i; if (len >= 3) { // 壁の前の区間 sig.push_back({0, dcnt, gcnt}); // type 0: segment dcnt = 0; gcnt = 0; // 壁そのもの。長さも固定だと思い込む。 sig.push_back({1, len, 0}); // type 1: wall } else { // o が 1,2 個なら壁ではないとして無視 // 区間内を自由に動けると思い込む } i = j; } // 最後の区間 sig.push_back({0, dcnt, gcnt}); return sig; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int Q; cin >> Q; while (Q--) { string S, T; cin >> S >> T; if (count_all(S) != count_all(T)) { cout << "No\n"; continue; } auto sigS = fake_signature(S); auto sigT = fake_signature(T); cout << (sigS == sigT ? "Yes" : "No") << '\n'; } return 0; }