#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 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 / 2; var maxG = 0; foreach (var j in a1) { if (j == 0) minD = Math.Min(minD, j); else if (j == 2) maxG = Math.Max(maxG, j); } rev1 = minD - maxG; (rev1, rev2, a1, a2) = (rev2, rev1, a2, a1); } for (var lp = 0; lp < 2; lp++) { var rle = a1.RunLengthEncoding(); if (rle.Count == 3) { var cz = rle.Select(e => e.Item1).ToArray(); if (cz[0] == 2 && cz[1] == 1 && cz[2] == 0 && rle[1].Item2 >= 3 && 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)); static class StringUtilities { public static List<(T, int)> RunLengthEncoding(this IEnumerable s) where T : IEquatable { var res = new List<(T, int)>(); if (!s.Any()) return res; var (pc, pl) = (s.First(), 1); foreach (var c in s.Skip(1)) { if (!c.Equals(pc)) { res.Add((pc, pl)); (pc, pl) = (c, 0); } pl++; } res.Add((pc, pl)); return res; } }