F - Error Correction Editorial by evima

別解

公式解説のように文字列を両側から走査することは必須ではありません。以下のように、ミスマッチを一度だけ許容して二つの文字列を先頭から比較することもできます。(文字列長に差があれば挿入か削除があったことを、差がなければそれらがなかったことを前提とします。)

実装例(Python)

def check(s, t):
    if len(s) > len(t):
        return check(t, s)
    if len(s) < len(t) - 1:
        return False
    i, j, miss = 0, 0, 0
    while i < len(s):
        if s[i] == t[j]:
            i += 1
            j += 1
        else:
            miss += 1
            if miss > 1:
                return False
            if len(s) == len(t):
                i += 1
            j += 1
    return True


N, T = input().split()
N = int(N)
ans = []
for i in range(N):
    S = input()
    if check(S, T):
        ans.append(i + 1)
print(len(ans))
print(" ".join(map(str, ans)))

posted:
last update: