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: Runtime Error)

using System;

class Program
{
 static void Main(string[] args)
 {
   string str = Console.ReadLine();
   int length = str.Length;
   int readPoint = 0;
   bool result = true;
   
   while( readPoint < length )
   {
     if( ( readPoint + 6 ) < length )
     {
       if( str.Substring(readPoint, 5) == "dream" )
       {
         if( ( readPoint + 7 ) < length )
         {
           if( str.Substring(readPoint+5, 2) == "er" )
           {
             if( str[readPoint+7] == 'a' )
             {
               readPoint += 5;
             }
             else
             {
               readPoint += 7;
             }
           }
           else
           {
             readPoint += 5;
           }
         }
         else
         {
           if( str.Substring(readPoint+5, 2) == "er" )
           {
             readPoint += 7;
           }
           else
           {
             result = false;
             break; 
           }
         }
       }
       else if( str.Substring(readPoint, 5) == "erase" )
       {
         if( str[readPoint+5] == 'r' )
         {
           readPoint += 6;
         }
         else
         {
          readPoint += 5; 
         }
       }
       else
       {
         result = false;
         break; 
       }
     }
     else if( ( readPoint + 4 ) < length )
     {
       if( str.Substring(readPoint, 5) == "dream" )
       {
         readPoint += 5;
       }
       else if( str.Substring(readPoint, 5) == "erase" )
       {
         if( str[readPoint+5] == 'r' )
         {
           readPoint += 6;
         }
         else
         {
          readPoint += 5; 
         }
       }
       else
       {
         result = false;
         break;
       }
     }
     else
     {
       result = false;
       break;
     }
   }
   
   Console.WriteLine("{0}",(result?"YES":"NO"));
 }
}