最小相似度 bfs O O哈哈

2021-10-04 19:09:57 字數 1165 閱讀 7144

題目描述:

定義兩個位數相等的二進位制串 a,b 的相似度 sim(a,b)=二進位制串a⊕b中0的個數。

如 a=00010,b=01000,a⊕b=01010,所以 sim(a,b)=3。

給定 n 個長度為 m 的二進位制串s1,s2…sn。

現在的問題是找出乙個額外的長度為 m 的二進位制字串 t ,使得 max最小。

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

輸入描述:

第一行兩個整數 n,m(1≤n≤3×105,1≤m≤20)。

然後 n 行,每行乙個長度 m 為的字串 si ​。

輸出描述:

輸出一行乙個整數表示答案-- max的最小值。

題中有「最大個數最小」這麼明顯的字眼,我們首先想到的就是二分的思想,不錯就是直接查詢 t ,不過當然不能二分查詢呀,我們需要查詢長度為m的所有 01 字串。但問題來了,我們怎麼才能查詢才符合「最大值」要求呢,我們可以把原有字串通過特殊變換得到查詢的 t ,那就把目標鎖定在這個特殊變換上,0的最大個數,就是1的最小個數(因為總數是m),所以這個特殊變換就是對原字串對某一位進行⊕1 ,就這樣一代一代的推下去,知道把所有的長度為m的 01 字串最大個數確定,最大個數最小值也就確定了,這就變成了乙個 簡單的bfs 問題,**如下:

#include

#include

using

namespace std;

const

int n =

1<<20;

inline

intread

(int xk =10)

struct node

//v也代表t為時,1的最小個數,m-v也就是0的最大個數 };

bool visit[n]

;queueq;

intbfs

(int m)}}

return m - res;

}int

main()

}printf

("%d\n"

,bfs

(m))

;return0;

}

相似度演算法之余弦相似度

余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 上圖兩個向量a,b的夾角很小可以說a向量和b向量有很高的的相似性,極端情況下,a和b向量完全重合。如下圖 如上圖二 可以認...

相似度計算之余弦相似度

一 定義及概念 余弦取值範圍為 1,1 求得兩個向量的夾角,並得出夾角對應的余弦值,此余弦值就可以用來表徵這兩個向量的相似性。夾角越小,趨近於0度,余弦值越接近於1,它們的方向更加吻合,則越相似。當兩個向量的方向完全相反夾角余弦取最小值 1。當余弦值為0時,兩向量正交,夾角為90度。因此可以看出,余...

計算向量相似度 余弦相似度

1.余弦相似度可用來計算兩個向量的相似程度 對於如何計算兩個向量的相似程度問題,可以把這它們想象成空間中的兩條線段,都是從原點 0,0,出發,指向不同的方向。兩條線段之間形成乙個夾角,如果夾角為0度,意味著方向相同 線段重合 如果夾角為90度,意味著形成直角,方向完全不相似 如果夾角為180度,意味...