ABC381 感想まとめ
今回は珍しく、金曜日の21時から開催。私は平日のため仕事に疲れ果てて降り、寝てしまっていました。そのため、土日に復習で問いたものを掲載します。
A - 11/22 String
問題文中の 11/22 文字列 をあらかじめ作っておいて、それと入力 S を比較しました。
N = int(input())
S = input()
half = (N + 1) // 2 - 1 # 半分の長さ
str = "1" * (half) + "/" + "2" * (half) # 11/22の文字列を作る
if S == str:
print("Yes")
else:
print("No")
B - 1122 String
問題文に数式が入っていてが若干わかりにくかった(麻雀を知っている人向けには、「数列がチートイツ かどうかを判定する問題」と言い換えられる)。
回答は、与えられた条件を順にチェックして、最後まで残ったら Yes という流れにしました。
S = input()
# 偶数チェック
if len(S) % 2 != 0:
print("No")
exit()
# ペアチェック
for i in range(1, len(S), 2):
if S[i-1] != S[i]:
print("No")
exit()
# 個数==2 かチェック
counter = defaultdict(int)
for s in S:
counter[s] += 1
for k, v in counter.items():
if v != 2 :
print("No")
exit()
C - 11/22 Substring
下記のような流れで処理しました。
- "1"の数をカウント(この段階では、"1" 以外の文字はスルー)
- "1"の連続の後に "/" が来るか判定
- "/" の後に "2" の連続があるか判定
- ここで、条件を満たす文字列が出来るなら、その長さを更新する
文字をカウントする one_counter, two_counter, slash_counter を用意し、パターンに応じて増やしたり初期化したりします。
N = int(input())
S = input()
one_counter = 0 # 1 のカウンター
two_counter = 0 # 2 のカウンター
slash_counter = 0
answer = 0 # 答えを格納
for i in range(N):
# "1"の数をカウント
if S[i] == '1':
if slash_counter > 0 or two_counter > 0:
one_counter = 0
one_counter += 1
two_counter = 0
slash_counter = 0
continue
if S[i] == '/':
slash_counter += 1
# slashがあれば、最低1にはなる
answer = max(answer, 1)
two_counter = 0
continue
if S[i] == '2':
# "1"の連続の後に "/" が来るか判定
if slash_counter != 1 or one_counter == 0:
slash_counter = 0
one_counter = 0
two_counter = 0
continue
# "/" の後に "2" の連続があるか判定
two_counter += 1
if slash_counter == 1:
if one_counter > 0:
# 条件を満たす文字列が出来るなら、その長さを更新する
same_count = min(one_counter, two_counter)
answer = max(answer, same_count * 2 + 1)
else:
# slash がない or 多い場合はリセット
slash_counter = 0
one_counter = 0
print(answer)