#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; 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) return false; } (a1, a2) = (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; } }