AtCoder Grand Contest 034 B – ABC をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Grand Contest 034 B – ABC

文字列を操作しやすいように事前に変えておけば、解くのがぐんと楽になる問題。

# AtCoder Grand Contest 034 B - ABC
# https://atcoder.jp/contests/agc034/tasks/agc034_b
# tag: 文字列 置換 最大値 事前操作 正規表現

# 'ABC' を 'BCA' に書き換えるとき、'BC' の並びは変更されない。
# そこで、とりあえず 'BC' を 'D' と書き換えてから考える。

# 文字列全体は、'B' もしくは 'C' によって分割された、
# 'A' 'D' の組み合わせによる文字列と考えられる。
# 'A'と'D'は交換可能だが、'B' 'C' の壁を越えることは出来ない。
# 例えば入力例3 だと、
# ADA C C B ADDAAD B
# となり、この ADA と ADDAAD を考慮することになる。

# それぞれの塊を、DD..DAA..A という状態になるまで
# 操作すれば、それが最大の回数となる。

import re
def main():
S = input()
S = S.replace('BC', 'D')

# 正規表現を用いて AD のグループを探す
groups = re.findall(r'[AD]+', S)

result = 0

for g in groups:
# 'D' を順番に数えつつ探し、左端に持っていくための
# 操作回数を足していく。
cnt_a = 0

# 具体的には、そこまでに現れた "A" の個数だけ
# "D" を左に移動することが出来る。
for idx, c in enumerate(g, start=1):
if c == 'A':
cnt_a += 1
elif c == 'D':
result += cnt_a

print(result)

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です