公式

B - Substring 2 解説 by sounansya


\(S\) の長さ \(M\) の部分文字列全てに対して、その位置と \(T\) を一致させるのに必要な操作回数を求めることを考えます。

\(S\) から取り出した長さ \(M\) の部分文字列を \(S'\) として、 \(f(c_1,c_2)\) を「文字 \(c_1\)\(c_2\) にするために必要な操作回数」とすると操作回数の合計は \(\displaystyle \sum_{k=1}^M f(T_k,S'_k)\) と表すことができます。

また、 \(f(c_1,c_2)\) は以下のように計算できます:

  • \(c_1,c_2\) を一桁の整数として見た値を \(x_1,x_2\) とする。
  • もし \(x_1 \le x_2\) なら \(f(c_1,c_2) = x_2-x_1\) である。
  • \(x_1 > x_2\) なら \(f(c_1,c_2) = x_2-x_1+10\) である。

この \(f\)\(f(c_1,c_2) = (x_2-x_1) \bmod 10\) と表すこともできます。(ただしこの式をそのまま実装すると C++ などでは負の数の剰余演算の都合上正しい答えを返さないことに注意してください)

以上を適切に実装することでこの問題に正答することができます。

実装例(Python3)

n, m = map(int, input().split())
s = input()
t = input()
ans = 10**9
for st in range(n - m + 1):
    res = 0
    for i in range(m):
        res += (int(s[st + i]) - int(t[i])) % 10
    ans = min(ans, res)
print(ans)

投稿日時:
最終更新: