G - Bonfire Editorial by harurun4635


時刻 \( a \)\( (0, 0) \) がある煙が時刻 \( b \)\( (R, C) \) に到達するというのは、 \( S[a:b) \) を操作した時にちょうどその操作で \( (R, C) \) 移動するということと同じことです。

もう少し言い換えると \( S[0:a) \) で移動した座標 \( (x_a, y_a) \)\( S[0:b) \) で移動した座標 \( (x_b, y_b) \) の差 \((x_b - x_a, y_b - y_a)\)\( (R, C) \) と一致するということでもあります。

\( (x_b - x_a, y_b - y_a) = (R, C)\) というのは \((x_b - R, y_b - C) = (x_a, y_a) \) とおなじことですから、「いま移動している距離」から \( (R, C) \) を引いた位置をこれまでに通過したかどうかを判定すればよいです。

実装例 (PyPy):

dir = {'N':(-1,0), 'W':(0,-1), 'S':(1,0), 'E':(0,1)}

N, R, C = map(int, input().split())
S = input()

x, y = 0, 0
st = set()
st.add((0, 0))
ans = [0] * N
for i in range(N):
    dx, dy = dir[S[i]]
    x += dx; y += dy
    
    if (x-R, y-C) in st:
        ans[i] = 1
    st.add((x, y))

print(*ans, sep = "")

posted:
last update: