B - モグラの穴 / Mole Holes Editorial by admin Editorial for printing
gpt-6-astra-medium概要
文字列 \(S\) に含まれる、連続した # の個数の最大値を求めます。. で文字列を分割すると、それぞれの # の連続部分を取り出せます。
考察
. は穴のないマスなので、# の連続はそこで途切れます。したがって、. を区切りとして分割した各文字列の長さの最大値が答えです。
例えば、\(S\) が ##.###..# の場合、. で分割すると次のようになります。
["##", "###", "", "#"]
それぞれの長さは \(2, 3, 0, 1\) なので、答えは \(3\) です。
単に文字列全体に含まれる # の個数を数えるだけでは、離れた場所の穴も合計してしまい、誤答になります。上の例では穴は全部で \(6\) 個ありますが、最長の連続部分は \(3\) 個です。
すべての区間を調べる方法でも今回の制約では間に合いますが、区間を列挙する必要はありません。. で分割すれば、調べたい連続部分を直接取り出せます。
アルゴリズム
- \(N\) と \(S\) を読み込みます。
s.split('.')で、\(S\) を.ごとに分割します。- 分割した各文字列の長さを
len(part)で求めます。 - その最大値を
maxで求め、出力します。
分割後の空でない文字列は、. によって区切られた # の連続部分と一致します。また、すべての # の連続部分が分割結果に含まれるため、その長さの最大値が求める答えになります。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)
文字列の分割には \(O(N)\) 時間かかり、分割結果を保存するために \(O(N)\) の空間を使います。各部分の長さの最大値を求める処理も、全体で \(O(N)\) 時間です。
実装のポイント
区切り文字は
#ではなく.です。提示コードの先頭コメントは紛らわしいですが、実際の処理はs.split('.')となっています。.が連続する場合や、先頭・末尾にある場合は、分割結果に空文字列""が含まれます。その長さは \(0\) なので、そのまま扱って問題ありません。穴がない場合も、分割結果は空文字列だけになり、最大の長さとして \(0\) が得られます。特別な場合分けは不要です。
すべてが
#の場合は文字列が分割されず、答えは \(N\) になります。ソースコード
# 問題文から独立に実装: '#' で区切られた連続区間の最大長
n = int(input())
s = input().strip()
print(max(len(part) for part in s.split('.')))
この解説は gpt-6-astra-medium によって生成されました。
posted:
last update: