牛客練習賽 41 D 最小相似度 BFS

2021-09-11 18:21:39 字數 1261 閱讀 1770

題意

定義兩個位數相等的二進位制串的相似度sim

(a,b

)=

二進位制串中a⊕

b中0的個數

sim\left( a,b \right) =\texta\oplus b\text

sim(a,

b)=二進位制串中a⊕

b中0的個數

給定n

nn個長度為m

mm的二進位制串。

現在的問題是找出乙個額外的長度為m

mm的二進位制字串

使得max

⁡\max \left\t \right) ...sim\left( s_n,t \right) \right\}

max最小。

因為滿足條件的可能不止乙個,不需要輸出串,只需要輸出這個最小值即可。

1 ≤n

≤3∗1

05

1 \leq n \leq 3*10^5

1≤n≤3∗

1051≤m

≤20

1 \leq m \leq 20

1≤m≤20

做法 由於m只有20,所以我們知道狀態數一共只有2^20,我們如果能算出每個狀態和給定n個字串相似度的最大值,這道題就解決了。首先我們知道所有n個串最初的dp值為m,通過bfs,把每個串丟進佇列一次,每個串改變每一位得到新的字串,更新那些沒出現過的串的dp值再丟進佇列,就可以保證當前步數為最大相似度。而且保證每個串只進一次佇列.複雜度就是o(20

∗220)

o(20*2^)

o(20∗2

20)

**

#include

#include

#include

#include

#include

using

namespace std;

const

int inf =

0x3f3f3f3f

;const

int maxn =

3e5+5;

char str[maxn][25

];int dp[

1<<21]

;queue<

int>q;

intmain()

int ans=inf;

while

(!q.

empty()

)}}printf

("%d\n"

,ans)

;return0;

}

牛客練習賽41 D 最小相似度(BFS)

思路 m最大只有20,如果把每個二進位制串看成乙個狀態,最多只有2 20 1048576個狀態,可以暴力搜尋。如果我們把某個串改變1位,這個改變後的串和這個串的答案就是m 1,比如01001,隨便改變1位變成01000,01001 01000 00001 答案就是m 1。我們要找的是m x的最小值,...

題解 牛客練習賽41 D 最小相似度

題目鏈結 text 首先考慮我們到底要求啥,實際就是要快速求出對於乙個數 x,所有數與它異或後的sim值。一種 的想法是直接列舉 t,顯然複雜度 因為 n 太大了,是 o 2 m times n 的。考慮把 n 乾掉,倒著想。題目的描述引導我們去二分答案。設當前答案是 mid,目標就是看是否存在乙個...

牛客練習賽41 D 最小相似度 思維 bfs

傳送門 給定nn n個長m mm位的二進位制串 求乙個二進位制串t tt,定義val ival i vali 是t tt與第i ii個二進位制串相同的位數 使得m ax val 1,va l2.va ln max val 1,val 2.val n max va l1 val2 val n 最小,只...