ABC049C - 白昼夢

atcoder.jp

後ろから比較すれば、dream は確実に dream だし、erase は確実に erase。

比較する範囲を前にスライドしていく際には、ReadOnlySpan<char> を使った。 余計な string のインスタンスが生成されるのを回避し、速度と読みやすさを両立できたのでは。

using System;

namespace ABC049C
{
    class Program
    {
        static void Main(string[] args)
        {
            const string dream = "dream";
            const string dreamer = "dreamer";
            const string erase = "erase";
            const string eraser = "eraser";

            var answer = "YES";
            var s = Console.ReadLine().AsSpan();
            while (s.Length != 0)
            {
                if (s.EndsWith(dream))
                {
                    s = s.Slice(0, s.Length - dream.Length);
                }
                else if (s.EndsWith(dreamer))
                {
                    s = s.Slice(0, s.Length - dreamer.Length);
                }
                else if (s.EndsWith(erase))
                {
                    s = s.Slice(0, s.Length - erase.Length);
                }
                else if (s.EndsWith(eraser))
                {
                    s = s.Slice(0, s.Length - eraser.Length);
                }
                else
                {
                    answer = "NO";
                    break;
                }
            }

            Console.WriteLine(answer);
        }
    }
}