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)

(defparameter +divide+
  (make-array '(4)
              :initial-contents
              '("dream" "dreamer" "erase" "eraser")))

(defmacro while (test &body body)
  `(do ()
       ((not ,test))
     ,@body))

(defun daydream (s)
  (let ((can1 t)
        can2
        (l (length s))
        (j 0)
        buff
        d)

    (setf s (reverse s))
    (dotimes (i 4)
      (setf (aref +divide+ i) (reverse (aref +divide+ i))))

    (while (< j l)
      (setf can2 nil)
      (dotimes (k 4)
        (setf d (aref +divide+ k))
        (if (>= l (+ (length d) j))
            (setf buff (subseq s j (+ (length d) j)))
            (setf buff (subseq s j)))
        (when (string= buff d)
          (setf can2 t)
          (setf j (+ j (length d)))
          (return)))
      (when (not (eq can2 t))
        (setf can1 nil)
        (return)))

    (if (eq can1 t)
        "YES"
        "NO")))

(format t "~A~%" (daydream (read-line)))