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 2.6.2) (judge verdict: Wrong Answer)

var s,t:ansistring;
ii,k,l,m,n,x,y,z:longint;
a,b,c,d,e,f,g,h,i,j:string;
begin
        readln(s);
        n:=length(s);
        s:=s+' ';
        a:='dream';
        b:='dreamer';
        c:='erase';
        d:='eraser';

        e:='dreamerdream';
        f:='dreamerase';
        g:='dreameraser';
        h:='dreamererase';
        i:='dreamereraser';
        j:='erasererase';

        for ii:=1 to n do
        begin
                t:=t+s[ii];
                if ii=n then
                begin
                        if(t=a) or (t=b) or (t=c) or (t=d) or (t=e) or (t=f) or (t=g) or (t=h) or (t=i) or (t=j) then
                        break;
                end;
                if (t=g) or (t=i) or (t=j) or (t=e) then t:=''  
                else if ((t=f) or (t=h)) and ((s[ii+1]<>'r') and (s[ii+1]<>'d') and (s[ii+1]<>'e') and (ii<n)) then
		begin
			writeln('NO');
			halt;
		end else 
                if ((pos(a,t)=0) and (pos(t,a)=0) and (pos(b,t)=0) and (pos(t,b)=0) and (pos(c,t)=0) and (pos(t,c)=0) and (pos(d,t)=0) and (pos(t,d)=0)) then
                begin
                        writeln('NO');
                        halt;
                end
                else if ((t=f) or (t=h)) and (s[ii+1] <> 'r') then t:='';
        end;
        writeln('YES');
end.