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 Kotlin (1.0.0) (judge verdict: Accepted)

fun main(args: Array<String>)
{
    var s = readString().reversed()
    val words = listOf("dream", "dreamer", "erase", "eraser").map{ it.reversed() }

    var flag = true
    while(flag && s.length > 0)
    {
        val containFlag = if (s.take(words[0].length) == words[0])
        {
            0
        }
        else if (s.take(words[1].length) == words[1])
        {
            1
        }
        else if (s.take(words[2].length) == words[2])
        {
            2
        }
        else if (s.take(words[3].length) == words[3])
        {
            3
        }
        else
        {
            -1
        }
        
        if (containFlag != -1)
        {
            s = s.drop(words[containFlag].length)
        }
        else
        {
            flag = false
        }
    }

    println(if (flag) "YES" else "NO")
}

// Read an integer
// Usage: val a = readInt()
fun readInt() = readLine()!!.toInt()

// Read N integers separated by " "
// Usage: val (a, b, c) = readNInts()
fun readNInts() = readLine()!!.split(" ").map(String::toInt)

// Read a string
// Usage: val a = readString()
fun readString() = readLine()!!