Problem:
Score : 300 points

Problem Statement

You are given a string S consisting of lowercase English letters.
Another string T is initially empty.
Determine whether it is possible to obtain S = T by performing the following operation an arbitrary number of times:

Append one of the following at the end of T: dream, dreamer, erase and eraser.

Constraints

1≦|S|≦10^5

S consists of lowercase English letters.

Input

The input is given from Standard Input in the following format:

S

Output

If it is possible to obtain S = T, print YES. Otherwise, print NO.

Sample Input 1

erasedream

Sample Output 1

YES

Append erase and dream at the end of T in this order, to obtain S = T.

Sample Input 2

dreameraser

Sample Output 2

YES

Append dream and eraser at the end of T in this order, to obtain S = T.

Sample Input 3

dreamerer

Sample Output 3

NO

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var N = Console.ReadLine();
        var isDream = false;
        var isErase = false;
        var isEr = false;
        var ans = "YES";
        var dream = "dream";
        var erase = "erase";
        for (int i= N.Length-1; 0<=i;--i)
        {

            if (N[i] == 'r') isEr = true;
            else if (N[i] == 'e') isErase = true;
            else if (N[i] == 'm') isDream = true;
            else
            {
                ans = "NO";
                break;
            }
            if (isDream)
            {
                for (int j=3;0<=j;--j)
                {
                    --i;
                    if (i < 0 || N[i] != dream[j])
                    {
                        ans = "NO";
                        break;
                    }
                }
                isDream = false;
            }
            if (isErase)
            {
                for (int j = 3; 0 <= j; --j)
                {
                    --i;
                    if (i < 0 || N[i] != erase[j])
                    {
                        ans = "NO";
                        break;
                    }
                }
                isErase = false;
            }
            if (isEr)
            {
                --i;
                if (i < 0 || N[i]!='e')
                {
                    ans = "NO";
                    break;
                }
                --i;
                if (i < 0 || (N[i]!='m'&&N[i]!='s'))
                {
                    ans = "NO";
                    break;
                }
                if(N[i] == 'm')
                {
                    for (int j = 3; 0 <= j; --j)
                    {
                        --i;
                        if (i < 0 || N[i] != dream[j])
                        {
                            ans = "NO";
                            break;
                        }
                    }
                }else if (N[i] == 's')
                {
                    for (int j = 2; 0 <= j; --j)
                    {
                        --i;
                        if (i < 0 || N[i] != erase[j])
                        {
                            ans = "NO";
                            break;
                        }
                    }
                }
                isEr = false;
            }
        }
        Console.WriteLine(ans);
    }
}