Boot camp for Beginners hard 023【C – 白昼夢】をpython解説

Boot camp for Beginners hard

Atcoder Problems という競プロを勉強する上でのコンテンツがあります。AtCoder Problems

今回は、hard100問の内、23問目を解説していきたいと思います。

問題名 【C – 白昼夢】

C – 白昼夢

考察

使える文字列:dream dreamer erase eraser

面倒なのは、「dreamer」という文字列があったときに、選択肢として

  • dream+erase
  • dream+eraser
  • dreamer

の3つがあることです。

この場合分けをするのは、かなり面倒です。なので、どうにか場合分けしないで済む方法をかんがえます。

文字列を全て反転させて考える。

文字列を前からではなく、後ろから文字列が一致するかを見ていきます。
そのため入力Sを反転させ、追加できる文字列も[maerd, remaerd, esare, resare]にして進めます。

そうすることで、場合分けをせずとも進めることができます。

コード

import sys
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def II(): return int(sys.stdin.readline())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def S(): return sys.stdin.readline().rstrip()
readline = sys.stdin.readline
sys.setrecursionlimit(10 ** 6)

letter = S()
reverse_letter = letter[::-1]
# print(reverse_letter)
reverse_list = ["maerd", "remaerd", "esare", "resare"]
cnt = 0
flg = 0
while cnt < len(reverse_letter):
    for reverse_keyword in reverse_list:
        flg += 1
        if reverse_letter[cnt:cnt+len(reverse_keyword)] == reverse_keyword:
            cnt += len(reverse_keyword)
            flg = 0
            break
    if flg == 4:
        print("NO")
        exit()
print("YES")

まとめ

前の問題 022【C – String Transformation】
次の問題

コメント

タイトルとURLをコピーしました