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 Common Lisp (SBCL 1.1.14) (judge verdict: Accepted)

(defmacro let-if (nv c true false)
  `(let (,nv) (if ,c ,true ,false)))

(defun daydream-with (str start)
  (let-if (len (- (length str) start))
    (< len 5)
    nil
    (let-if (dream (string= #.(reverse "dream")
                       (subseq str start (+ start 5))))
      dream 5
      (let-if (erase (string= #.(reverse "erase")
                       (subseq str start (+ start 5))))
        erase 5
        (if (< len 6)
          nil
          (let-if (eraser (string= #.(reverse "eraser")
                            (subseq str start (+ start 6))))
            eraser 6
            (if (< len 7)
              nil
              (let-if (dreamer (string= #.(reverse "dreamer")
                                 (subseq str start (+ start 7))))
                dreamer 7
                nil))))))))

(let* ((s (reverse (read-line)))
       (len (length s))
       (r 0))
  (loop for i = (daydream-with s r)
        if (null i) do (return)
        else do (incf r i)
        while (>= len r))
  (if (>= r len)
    (format t "YES~%")
    (format t "NO~%")))