Official
A - 暗証番号の入力 / Entering the PIN Editorial by admin Editorial for printing
Qwen3-Coder-480B概要
正しい暗証番号と高橋君の入力を比較し、連続して正しく入力できた最大の桁数を求めます。
考察
この問題では、2つの文字列 \(S\)(正しい暗証番号)と \(T\)(入力したボタン列)を比較し、「一致している連続する部分列」の最大長を求める必要があります。
例えば、以下のような入力を考えます:
N = 5
S = "LRLRR"
T = "LRLRL"
このとき、各桁の一致・不一致は次のようになります:
| 桁 | S[i] | T[i] | 一致 |
|---|---|---|---|
| 0 | L | L | ○ |
| 1 | R | R | ○ |
| 2 | L | L | ○ |
| 3 | R | R | ○ |
| 4 | R | L | × |
この例では最初の4桁が連続して一致しており、これが最大の連続一致長となります。
素朴な方法として、すべての部分列について一致を確認する方法がありますが、その計算量は \(O(N^2)\) となり、制約 \(N \leq 2 \times 10^5\) では時間内に処理できません。
そこで、線形探索で「現在の連続一致長」を保持しながら、最大値を更新していく方法を使います。これにより、一度の走査で答えを得ることができます。
アルゴリズム
- 文字列 \(S\) と \(T\) を比較し、各桁が一致しているかどうかのフラグ(1 or 0)を持つリスト
matchを作成します。 - このリストに対して、連続する1の最大長を求める処理を行います:
- 現在の連続長
current_lenと、これまでの最大長max_lenを管理します。 - リストを前から見ていき、1なら
current_lenを増やし、max_lenを更新します。 - 0が現れたら、
current_lenを0に戻します。
- 現在の連続長
- 最終的な
max_lenを出力します。
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(N)\)
実装のポイント
各桁の一致を前処理で
matchリストとして持つことで、ロジックがシンプルになります。連続長の更新処理では、
elseでcurrent_lenをリセットすることを忘れないようにしましょう。ソースコード
def solve():
N = int(input())
S = input().strip()
T = input().strip()
# 一致する場所を1、異なる場所を0としたリストを作成
match = [1 if S[i] == T[i] else 0 for i in range(N)]
# 連続する1の最大長を求める
max_len = 0
current_len = 0
for val in match:
if val == 1:
current_len += 1
max_len = max(max_len, current_len)
else:
current_len = 0
print(max_len)
if __name__ == "__main__":
solve()
この解説は qwen3-coder-480b によって生成されました。
posted:
last update: