題意
定義兩個位數相等的二進位制串的相似度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 最小,只...