#nullable enable using System.Numerics; void Run() { var n = Int(); var m = Int(); var cz = new (int, int)[n][]; { var dd = new Dictionary<char, (int, int)> { ['L'] = (-1, 0), ['D'] = (0, -1), ['U'] = (0, 1), ['R'] = (1, 0), }; for (var i = 0; i < n; i++) { var str = String(); var cs = new Stack<(int, int)>(); for (var j = 0; j < m; j++) { var d = dd[str[j]]; var (dx, dy) = d; if (cs.Count > 0 && cs.Peek() == (-dx, -dy)) cs.Pop(); else cs.Push(d); } cz[i] = cs.ToArray(); } } var ans = 0; bool F(int i) { var c = cz[i]; var (x, y) = (0, 0); var (lx, ly) = (0, 0); var tp = 0; var pu = false; for (var j = 0; j < c.Length; j++) { var (dx, dy) = c[j]; if ((x, y) == (0, 0)) { (lx, ly) = (dx, dy); if (ly > 0) pu ^= true; } if (x == 0 && y >= 0) tp += dx; x += dx; y += dy; if (x == 0 && y >= 0) { tp += dx; if (dy != 0) pu ^= true; } if ((x, y) == (0, 0)) { if (tp != 0) return false; var l = (lx, ly); var d = (dx, dy); if (l == (0, 1) ^ d == (0, -1)) return false; if (tp != 0 || pu) return false; } } return true; } for (var i = 0; i < n; i++) if (F(i)) ans++; Out(ans); } #region AtCoderIO _io_; var _backend_ = new StandardIOBackend(); _io_ = new(){ Backend = _backend_ }; Run(); _backend_.Flush(); string String() => _io_.Next(); int Int() => int.Parse(String()); void Out(object? x, string? sep = null) => _io_.Out(x, sep); class AtCoderIO { public required StandardIOBackend Backend { get; init; } Memory<string> _input = Array.Empty<string>(); int _iter = 0; public string Next() { while (_iter >= _input.Length) (_input, _iter) = (Backend.ReadLine().Split(' '), 0); return _input.Span[_iter++]; } public void Out(object? x, string? separator = null) { if (x == null) return; separator ??= Environment.NewLine; if (x is System.Collections.IEnumerable a and not string) { var objects = a.Cast<object>(); if (separator == Environment.NewLine && !objects.Any()) return; x = string.Join(separator, objects); } Backend.WriteLine(x); } } class StandardIOBackend { readonly StreamReader _sr = new(Console.OpenStandardInput()); readonly StreamWriter _sw = new(Console.OpenStandardOutput()) { AutoFlush = false }; public string ReadLine() => _sr.ReadLine()!; public void WriteLine(object? value) => _sw.WriteLine(value); public void Flush() => _sw.Flush(); } #endregion static class Extensions { public static T[] Repeat<T>(this int time, Func<T> F) => Enumerable.Range(0, time).Select(_ => F()).ToArray(); }