0.はじめに
前回は見逃していたため、久々のARC。1問は解きたいと思っていましたが
なんとかAだけクリアできました。
Bもあがいてみましたが、思い描く仕様を実装するにはスキルが足りず
その仕様も後に解説と見比べると今一だったので、まだまだ修行が足りなそうです。
とはいえ、去年からの緑はキープし、初のレート900台(901ですが・・・)に達しました。
1.A - Yet Another AB Problem
単純な解き方だと穴が発生してその穴に気づかないと嵌る問題(個人の感想)。
【考え方】
〇基本ケースのカウント
・S[i]がB&T[i]の時をBA、S[i]がA、T[i]がBの時をABとする。
・SとTを先頭から一文字ずつ比較し、BAの個数とABの個数をカウントしていく
→BAが1以上かつABの時、一緒に変換可能なので、別途変数PCにカウントを追加し
BAのカウントを1減らす(ABにも加算しない)
〇一致させることが可能かのチェック
・例えば以下のような場合問題の条件(i<j)より、SとTを一致させられない
例1)変換が必要となる先頭がABのため、変換できない
1-1.先頭がAB
S:ABABA
T:BBABA
1-2.ABは先頭ではないが、ペアで変換するAが前にない
S:BABABA
T:BBBABA
※例えば以下のような場合、i=1、J=2とすれば、変換可能
S:AABABA
T:ABBABA
例2)変換が必要となる末尾がBAのため、変換できない
1-1.末尾がBA
S:ABABB
T:ABABA
1-2.BAは末尾ではないが、ペアで変換するBが後ろにない
S:BABABA
T:BABAAA
・例1の状態チェックのため、先頭から見ていき、T[i]がAの時FAフラグに1をセット
→AB状態かつ、FTフラグが0の場合は変換不能のため、-1を出力して終了
・例2の状態チェックのため、末尾から見ていき、T[i]がBの時LBフラグに1をセット
→BA状態かつ、LBフラグが0の場合は変換不能のため、-1を出力して終了
上記を実装し、O(2N)でAC頂けました。
https://atcoder.jp/contests/arc170/submissions/49549016
以上