公式

E - Shortest Duplicate Subarray 解説 by hirayuu_At


まず、「同じ値を複数個含む」を「 \(1\) を複数個含む」に言い換えた問題を考えます。

これは、\(A_i=1\) なる \(i\) を昇順に並び替え、隣り合う部分の差を考えればよいです。

\(1\) をほかの値に置き換えても同じことが可能です。添字をグループ分けする作業をはじめに行っておくことで、\(O(N)\) でこの問題を解くことができました。

実装例 (Python3)

N = int(input())
A = list(map(int, input().split()))

ans = N + 1
pos = [[] for _ in range(1_000_001)]

for i in range(N):
    pos[A[i]].append(i)

for i in range(1_000_001):
    if len(pos[i]) < 2:
        continue
    for j in range(len(pos[i]) - 1):
        ans = min(ans, pos[i][j + 1] - pos[i][j] + 1)

if ans == N + 1:
    print(-1)
else:
    print(ans)

余談

いわゆる尺取り法と呼ばれるテクニックを用いてもこの問題を解くことができます。

投稿日時:
最終更新: