#nullable enable #region var (_input, _iter) = (Array.Empty(), 0); T I() where T : IParsable { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Trim().Split(' '), 0); return T.Parse(_input[_iter++], null); } #endregion static T[] Range(int n, Func F) => Enumerable.Range(0, n).Select(_ => F()).ToArray(); bool Solve(string s, string t) { var n = s.Length; var a1 = new List(); var a2 = new List(); var ca = new int[3]; for (var lp = -1; lp <= 1; lp += 2) { foreach (var c in s) { var j = 1; if (c == 'd') j = 0; else if (c == 'g') j = 2; a1.Add(j); ca[j] += lp; } (a1, a2, s, t) = (a2, a1, t, s); } if (ca.Max() != 0 || ca.Min() != 0) return false; var rev1 = 0; var rev2 = 0; for (var lp = 0; lp < 2; lp++) { var minD = int.MaxValue / 4; var maxG = int.MinValue / 4; for (var i = 0; i < n; i++) { var j = a1[i]; if (j == 0) minD = Math.Min(minD, i); else if (j == 2) maxG = Math.Max(maxG, i); } rev1 = minD - maxG; (rev1, rev2, a1, a2) = (rev2, rev1, a2, a1); } for (var lp = 0; lp < 2; lp++) { if (rev1 >= 3 && rev1 <= n) { if (rev2 <= 3) return false; } (rev1, rev2, a1, a2) = (rev2, rev1, a2, a1); } return true; } var ans = Range(I(), () => Solve(I(), I()) ? "Yes" : "No"); Console.WriteLine(string.Join(Environment.NewLine, ans));