Official
E - Shortest Duplicate Subarray Editorial
by
E - Shortest Duplicate Subarray Editorial
by
hirayuu_At
まず、「同じ値を複数個含む」を「 \(1\) を複数個含む」に言い換えた問題を考えます。
これは、\(A_i=1\) なる \(i\) を昇順に並び替え、隣り合う部分の差を考えればよいです。
\(1\) をほかの値に置き換えても同じことが可能です。添字をグループ分けする作業をはじめに行っておくことで、\(O(N)\) でこの問題を解くことができました。
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)
余談
いわゆる尺取り法と呼ばれるテクニックを用いてもこの問題を解くことができます。
posted:
last update: