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 (Python):
import subprocess
import gzip, base64, os
import stat

gz = b'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'
bin = gzip.decompress(base64.b64decode(gz))
p = os.path.dirname(__file__)
pymain = os.path.join(p, "a.out")
with open(pymain, "wb") as f:
    f.write(bin)
os.chmod(pymain, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
if p == "":
    pymain = "./" + pymain
subprocess.call(pymain)



'''

import numpy as np

def str2array(s, a):
    for i in range(a.shape[0]):
        a[i] = ord(s[i])

def equal(s, i, a):
    for j in range(a.shape[0]):
        if a[j] != ord(s[i + j]):
            return 0
    return 1

def main2():
    s = open('/dev/stdin').readline()
    dream = np.empty(5, dtype=np.int32)
    str2array('dream', dream)
    dreamer = np.empty(7, dtype=np.int32)
    str2array('dreamer', dreamer)
    erase = np.empty(5, dtype=np.int32)
    str2array('erase', erase)
    eraser = np.empty(6, dtype=np.int32)
    str2array('eraser', eraser)
    r = ord('r')
    i = len(s) - 1
    while True:
        if i < 10:
            if (i == 5 and (equal(s, 0, dream) or equal(s, 0, erase))) or \
                    (i == 6 and equal(s, 0, eraser)) or \
                    (i == 7 and equal(s, 0, dreamer)):
                print('YES')
            else:
                print('NO')
            return
        else:
            if ord(s[i - 1]) == r:
                if equal(s, i - 7, dreamer):
                    i -= 7
                elif equal(s, i - 6, eraser):
                    i -= 6
                else:
                    print('NO')
                    return
            else:
                if equal(s, i - 5, dream) or equal(s, i - 5, erase):
                    i -= 5
                else:
                    print('NO')
                    return
'''

Solution (Python):
s=input()[::-1]
rs=s.replace('resare','').replace('esare','').replace('remaerd','').replace('maerd','')
if rs in '':
    print('YES')
else:
    print('NO')

Solution (Python):
S = input()
rS = S[::-1]
k = 0
while True:
    if k == len(rS):
        print("YES")
        break    
    elif rS[k:k + 5] == "maerd":
        k = k + 5
    elif rS[k:k + 5] == "esare":
        k = k + 5
    elif rS[k:k + 7] == "remaerd":
        k = k + 7
    elif rS[k:k + 6] == "resare":
        k = k + 6
    else:
        print("NO")
        break

Solution (Python):


def resolve():
    s = input()
    while (len(s) != 0):
        if s.rfind('eraser') == len(s) - len('eraser') and len(s) - len('eraser') >= 0:
            s = s[:len(s) - len('eraser')]
        elif s.rfind('erase') == len(s) - len('erase') and len(s) - len('erase') >= 0:
            s = s[:len(s) - len('erase')]
        elif s.rfind('dreamer') == len(s) - len('dreamer') and len(s) - len('dreamer') >= 0:
            s = s[:len(s) - len('dreamer')]
        elif s.rfind('dream') == len(s) - len('dream') and len(s) - len('dream') >= 0:
            s = s[:len(s) - len('dream')]
        else:
            print('NO')
            return

    if len(s) == 0:
        print('YES')
    else:
        print("NO")


if __name__ == "__main__":
    resolve()

Solution (Python):
print('NO' if input().replace('eraser','').replace('erase','').replace('dreamer','').replace('dream','') else 'YES')

Solution (Python):
s=input().replace("eraser"," ").replace("erase"," ").replace("dreamer"," ").replace("dream"," ").replace(" ","")
if s:
    print("NO")
else:
    print("YES")

Solution (Python):
s=input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")
if s:
    print("NO")
else:
    print("YES")

Solution (Python):
S=input()

if len(S.replace('eraser','').replace('erase','').replace('dreamer','').replace('dream',''))==0:
  print('YES')
else:
  print('NO')

Solution (Python):
s=input()
while len(s)>=5:
  if len(s)<=9:
    if s=='dream' or s=='dreamer' or s=='erase' or s=='eraser':
      print('YES')
      exit()
    else:
      print('NO')
      exit()
  else:
    if s[0:5]=='dream':
      s=s[5:]
      if s[0:2]=='er' and s[2]!='a':
        s=s[2:]
    elif s[0:5]=='erase':
      if s[5]=='r':
        s=s[6:]
      else:
        s=s[5:]
    else:
      print('NO')
      exit()

Solution (Python):
S = input()[::-1]
n = len(S)
count = 0
flag = True

while count<n:
    if S[count:count+5] == "dream"[::-1]:
        count += 5
    elif S[count:count+7] == "dreamer"[::-1]:
        count += 7
    elif S[count:count+5] == "erase"[::-1]:
        count += 5
    elif S[count:count+6] == "eraser"[::-1]:
        count += 6
    else:
        flag = False
        break

print("YES") if flag else print("NO")

Solution (Python):
s = input().replace("eraser", "").replace("erase", "").replace("dreamer", "").replace("dream", "")
if s:
    print("NO")
else:
    print("YES")

Solution (Python):
s = input()
d = ['dream', 'dreamer', 'erase', 'eraser']
s = s[::-1]
for i in range(len(d)):
    d[i]= d[i][::-1]
while s != '':
    for j in range(len(d)):
        if s[0:len(d[j])] == d[j]:
            s = s[len(d[j]):]
            break
    else:
        print('NO')
        break
else:
    print('YES')

Solution (Python):
s=input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")
if s:
    print("NO")
else:
    print("YES")

Solution (Python):

s = input()

dp = [0] * 100007 

t_element_list = ["dream", "dreamer", "erase", "eraser"]

dp[0] = 1
for i in range(len(s)):
    if dp[i] == 1:
        for j in range(len(t_element_list)):
            if s[i:i+len(t_element_list[j])] == t_element_list[j]:
                dp[i + len(t_element_list[j])] = 1

if dp[len(s)] == 1:
    print('YES')
else:
    print('NO')

Solution (Python):
s = input()

ok = True
index = len(s)
while True:
    if index == 0:
        break

    if s[index - 1] == 'r':
        if index - 6 >= 0 and s[index - 6:index] == 'eraser':
            index -= 6
        elif index - 7 >= 0 and s[index - 7:index] == 'dreamer':
            index -= 7
        else:
            ok = False
            break
    elif s[index - 1] == 'e':
        if index - 5 < 0 or s[index - 5:index] != 'erase':
            ok = False
            break
        else:
            index -= 5
    elif s[index - 1] == 'm':
        if index - 5 < 0 or s[index - 5:index] != 'dream':
            ok = False
            break
        else:
            index -= 5
    else:
        ok = False
        break
if ok:
    print('YES')
else:
    print('NO')

Solution (Python):
s = input()
while s != '':
    tmp = s
    s = s.replace('eraser', '')
    s = s.replace('erase', '')
    s = s.replace('dreamer', '')
    s = s.replace('dream', '')
    if s == '':
        print('YES')
    if tmp == s:
        print('NO')
        break

Solution (Python):
def main():
    S = input()

    i = 0
    while i < len(S):
        if S[i:i+7] == "dreamer" and (i+7 == len(S) or (i+7 < len(S) and S[i+7] != "a")):
            i += 7
        elif S[i:i+6] == "eraser":
            i += 6
        elif S[i:i+5] == "dream" or S[i:i+5] == "erase":
            i += 5
        else:
            return "NO"

    return "YES"



if __name__ == '__main__':

    print(main())

Solution (Python):
import math
import numpy as np














s = input()

s = s.replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")


if s:
    print("NO")
else:
    print("YES")

Solution (Python):
s = input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")

print("YES" if s=="" else "NO")

Solution (Python):
s=input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")
if s=="":
  print("YES")
else:
  print("NO")

Solution (Python):
S = input()
 
while len(S) > 0:
  if "dreameraser" in S:
    S = S.replace("dreameraser","")
  elif "dreamerase" in S:
    S = S.replace("dreamerase","")
  elif "dreamer" in S:
    S = S.replace("dreamer","")
  elif "dream" in S:
    S = S.replace("dream","")
  elif "eraser" in S:
    S = S.replace("eraser","")
  elif "erase" in S:
    S = S.replace("erase","")
  else:
    break
    
if len(S) == 0:
  print("YES")
else:
  print("NO")

Solution (Python):
s = input()
d = ["dream", "dreamer", "erase", "eraser"]
s = s[::-1]
can = False
for i in range(len(d)):
    d[i] = d[i][::-1]
while(s != ""):
    for i in range(4):
        if s[0:len(d[i])] == d[i]:
            s = s[len(d[i]):]
            break
    else:
        break
else:
    can = True
if can == True:
    print("YES")
else:
    print("NO")

Solution (Python):
import sys
sys.setrecursionlimit(12345678)
import itertools
from collections import Counter
from collections import defaultdict
from collections import deque
import bisect
from heapq import heappush, heappop


def main():
    s = input()
    possible = [False] * (len(s) + 1)
    possible[0] = True

    candidates = ['dream', 'dreamer', 'erase', 'eraser']
    for i in range(len(s)):
        if not possible[i]:
            continue
        for c in candidates:
            if s[i:i+len(c)] == c:
                possible[i + len(c)] = True

    print('YES' if possible[-1] else 'NO')


if __name__ == '__main__':
    main()

Solution (Python):
import sys
import re

if sys.platform =='ios':
    sys.stdin=open('input_file.txt')


S=input()
s=S.replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")

if s:
	print("NO")
else:
	print("YES")

Solution (Python):
S = input()
if len(S)<5:
    print('NO')
else:
    while True:
        if len(S) == 0:
            print('YES')
            break
        if S[-5:] == 'dream':
            S = S[:-5]
        elif S[-7:] == 'dreamer':
            S = S[:-7]
        elif S[-5:] == 'erase':
            S = S[:-5]
        elif S[-6:] == 'eraser':
            S = S[:-6]
        else:
            print('NO')
            break

Solution (Python):
s=input()[::-1]

isOk=False
while len(s)>=5:
    if s[:5]=="maerd" or s[:5]=="esare":
        s=s[5:]
    elif len(s)>=6 and s[:6]=="resare":
        s=s[6:]
    elif len(s)>=7 and s[:7]=="remaerd":
        s=s[7:]
    else:
        break
    
    if len(s)==0:
        isOk=True

print("YES") if isOk else print("NO")

Solution (Python):
def main():
    s = input()
    while s:
        if s[:7] == 'dreamer':
            if s[:10] != 'dreamerase':
                s = s[7:]
            else:
                s = s[5:]
        elif s[:5] == 'dream':
            s = s[5:]
        elif s[:6] == 'eraser':
            if s[:10] != 'eraseerase':
                s = s[6:]
            else:
                s = s[5:]
        elif s[:5] == 'erase':
            s = s[5:]
        else:
            return 'NO'
    else:
        return 'YES'





print(main())

Solution (Python):
import math, string, itertools, fractions, heapq, collections, re,  array, bisect, sys, random, time, copy, functools
sys.setrecursionlimit(10**7)
inf = 10 ** 20
eps = 1.0 / 10**10
mod = 10**9+7
dd = [(-1, 0), (0, 1), (1, 0), (0, -1)]
ddn = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)]
def LI(): return [int(x) for x in sys.stdin.readline().split()]
def LI_(): return [int(x)-1 for x in sys.stdin.readline().split()]
def LF(): return [float(x) for x in sys.stdin.readline().split()]
def LS(): return sys.stdin.readline().split()
def _I(): return int(sys.stdin.readline())
def _F(): return float(sys.stdin.readline())
def _pf(s): return print(s, flush=True)

"""
逆にSを殻にする
"""
S = input()
S = S.replace('eraser', '')
S = S.replace('erase', '')
S = S.replace('dreamer', '')
S = S.replace('dream', '')
if len(S) == 0:
    print("YES")
else:
    print("NO")

Solution (Python):
S = input()
S = S.replace("eraser", "")\
    .replace("erase", "")\
    .replace("dreamer", "")\
    .replace("dream", "")
T = ""
if S == T:
    print("YES")
else:
    print("NO")

Solution (Python):
st = input()

sample = ['dream', 'dreamer', 'erase', 'eraser']
sample_edit = ['dream', 'eraser','erase', 'er']
sample_er = ['er']
sample_dr = ['dream']
sample_ase = ['ase', 'aser']

ret = 'NO'
reg_len = 0
fd_word = ''
dream_flg = False
end_flg = False

word = ''
length = len(sample_edit)


while( True ):
  if reg_len == len(st):
    break
  
  reg_len = len(st)
  for i in range(length):
    word = sample_edit[i]
    fd = st.startswith(word)
    
    if fd > 0:
      
      
      
      st = st[len(word):len(st)]
        
      if word == 'dream':
        dream_flg = True
      elif word == 'er':
        if dream_flg == False:
          end_flg = True
        else:
          dream_flg = False
      
      break
    
        
  if end_flg == True:
    break
    
  if len(st) == 0:
    ret = 'YES'
    break
    
  
  

print( ret )

Solution (Python):
import sys
str = input()
str = str[::-1]
ary = ['dream','dreamer','erase','eraser']
x = 0
good = True

for i in range(4):
    ary[i] = ary[i][::-1]

while good:
    for i in range(4):
        if str.find(ary[i],x,x + len(ary[i])) > -1:
            x += len(ary[i])
            break
    else:
        good = False
if x == len(str):
    print("YES")
else:
    print("NO")

Solution (Python):
import re;
str = input()
if re.match(r"^(dream|dreamer|erase|eraser)+$",str):
    print("YES")
    exit(0)
print("NO")

Solution (Python):
s = input()

dream = 'dream'
erase = 'erase'
dreamer = 'dreamer'
eraser = 'eraser'
ans = 'YES'
n = len(s)
while n > 0:
  if s[n-5:n] == dream:
    n += -5
  elif s[n-5:n] == erase:
    n += -5
  elif s[n-6:n] == eraser:
    n += -6
  elif s[n-7:n] == dreamer:
    n += -7
  else:
    ans = 'NO'
    break
print(ans)

Solution (Python):
import re;print("YNEOS"[re.match(r"^(dream|dreamer|erase|eraser)+$",input())==None::2])