[BOJ/Python]20304パスワード作成
この問題は幅優先探索とビットマスクを組み合わせた方法で解いた.一人の力が近づきにくいので、グーグルの力で解決しました.この問題の核心は,
(시도한 비밀번호) XOR (1이 k개 들어간 임의의 bit) = 비밀번호 후보
で得られた비밀번호 후보
を用いて(비밀번호 후보) XOR (시도한 비밀번호) = 1이 k개 들어간 임의의 bit
を再求め,このとき任意のビットの1個数が安全距離となることである.従って、現在の安全距離と安全距離とが1だけ異なるパスワード候補の安全距離を更新することにより解決される.幅優先検索なので、パスワード候補のセキュリティ距離を更新する場合は、その候補を検索するためにキューにパスワード候補を追加する必要があります.
->
safety[i]
が0に更新されました.->dqにiを加える.
->dq抽出cur.
->mx lenのiのfor文.
-->
(1이 i개 들어간 임의의 bit) XOR (현재 비밀번호 후보)
の値を一時変数xに格納します.-->xがn以下の場合、
safety[cur]+1
はsafety[x]
未満である.-->
safety[x]
がsafety[cur]+1
に更新されました.----->答えを
safety[x]
と答えのより大きな値に更新します.-->dqプラスx.
Code import collections
import sys
input=sys.stdin.readline
n=int(input())
m=int(input())
hacker=list(map(int, input().split()))
mx_len=len(bin(n)[2:])
safety=[mx_len+1 for _ in range(n+1)]
dq=collections.deque()
for i in hacker:
safety[i]=0
dq.append(i)
answer=0
while dq:
cur=dq.popleft()
for i in range(mx_len):
x=(1<<i)^cur
if x<=n and safety[cur]+1<safety[x]:
safety[x]=safety[cur]+1
answer=max(safety[x], answer)
dq.append(x)
print(answer)
Reference
この問題について([BOJ/Python]20304パスワード作成), 我々は、より多くの情報をここで見つけました
https://velog.io/@xx0hn/BOJ-Python-20304번-비밀번호-제작
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
import collections
import sys
input=sys.stdin.readline
n=int(input())
m=int(input())
hacker=list(map(int, input().split()))
mx_len=len(bin(n)[2:])
safety=[mx_len+1 for _ in range(n+1)]
dq=collections.deque()
for i in hacker:
safety[i]=0
dq.append(i)
answer=0
while dq:
cur=dq.popleft()
for i in range(mx_len):
x=(1<<i)^cur
if x<=n and safety[cur]+1<safety[x]:
safety[x]=safety[cur]+1
answer=max(safety[x], answer)
dq.append(x)
print(answer)
Reference
この問題について([BOJ/Python]20304パスワード作成), 我々は、より多くの情報をここで見つけました https://velog.io/@xx0hn/BOJ-Python-20304번-비밀번호-제작テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol