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 Pascal (FPC 3.0.4) (judge verdict: Wrong Answer)

var s,t,v,w1,w2:ansistring;
    a:array[1..4] of ansistring=('dreamer','eraser','dream','erase');
    i,j,k:longint;
begin
  readln(s);
  t:='';
  v:='';
  w1:=s;
  w2:=s;
  while (length(s)<>0) do begin
  
      
      if (pos('dreamer',s)=1) then begin
        delete(w1,pos(a[1],w1),length(a[1]));
        delete(w2,pos(a[3],w2),length(a[3]));
        if (pos(a[2],w2)=1) or (pos(a[4],w2)=1) then begin
          t:=t+a[3];
          delete(s,1,length(a[3]));
        end
        else begin
          t:=t+a[1];
          delete(s,1,length(a[1]));
        end;
      end
      else if (pos('eraser',s)=1) then begin
        delete(w1,pos(a[2],w1),length(a[2]));
        delete(w2,pos(a[4],w2),length(a[4]));
        if (pos(a[2],w2)=1) or (pos(a[4],w2)=1) then begin
          t:=t+a[4];
          delete(s,1,length(a[4]));
        end
        else begin
          t:=t+a[2];
          delete(s,1,length(a[2]));
        end;
      end
      else if (pos('dream',s)=1) then begin
        t:=t+a[3];
        delete(s,1,length(a[3]));
      end
      else if (pos('erase',s)=1) then begin
        t:=t+a[4];
        delete(s,1,length(a[4]));
      end
      else begin
        writeln('NO');
        exit;
      end;
      
  end;
  if (s<>t) and (v<>s) then writeln('NO')
  else writeln('YES');
end.