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

2022-04-29 21:36:20 字數 974 閱讀 2509

思路不錯的題目

考慮到總體的狀態數只有\(2^m\)中,如果我們把某個串改變1位,這個改變後的串和這個串的答案就是\(m-1\),由此可見,每個串到另乙個串都有乙個距離,我們把這個距離設為改變的位數,所有串到某個串都有乙個最小位數\(x\),這個最小位數的最大值\(y\)的答案\(m-y\)就是我們的答案。

我們發現這就是乙個最短路,直接拿bfs實現,複雜度\(o(n+m2^m)\)

然後還有一種\(fwt\)的做法

注意到\(a \ xor \ b=c\rightarrow b=a \ xor \ c\)

然後我們列舉或者二分答案為\(x\)後\(c\)就是確定的了,就是\(c_i=[f(i)<=x]\),\(f(i)\)表示二進位制串下\(1\)的個數

然後\(a\)卷\(c\),如果存在\(b_i=n\)就說明所以的串都卷上去了,這個答案就合法

code:(bfs):

#include #include #include template void read(t &x)

const int n=1<<20;

int q[n+10],dp[n],l=1,r;

int n,m;

char s[23];

int main()

const int mod=998244353,inv=499122177;

inline int add(int a,int b)

#define mul(a,b) (1ll*(a)*(b)%mod)

const int n=1<<20;

int n,m,a[n],b[n],d[n];

char s[23];

void fwt(int *a,int len,int typ)

printf("%d\n",l);

return 0;

}

2019.3.2

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

傳送門 由於m只有20,所以我們知道狀態數一共只有2 20,我們如果能算出每個狀態和給定n個字串相似度的最大值,這道題就解決了。首先我們知道所有n個串最初的dp值為m,通過bfs,把每個串丟進佇列一次,每個串改變每一位得到新的字串,相同位少了乙個 即相似度減一,更新那些沒出現過的串的dp值再丟進佇列...

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

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

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

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