3231 佛山市選2013 海明距離

2021-10-08 22:24:29 字數 1321 閱讀 5271

對於二進位制串a,b,他們之間的海明距離是指兩個串異或之後串中1的個數。異或的規則為:

0 xor 0 = 0

1 xor 0 = 1

0 xor 1 = 1

1 xor 1 = 0

計算兩個串之間的海明距離的時候,他們的長度必須相同。現在我們給出n個不同的二進位制串,請計算出這些串兩兩之間的最短海明距離。

第乙個數字是整數t(t≤10),代表資料的組數。

接下來有t組資料,每組資料的第一行是乙個正整數n,代表不同的二進位制串的個數。接下來是n行,每行都是乙個二進位制串(長度是5)。我們用數字(0-9)和字元(a-f)來表示這個二進位制串。它代表這個二進位制串的16進製製碼。例如,「12345」代表的二進位制串為「00010010001101000101」。 

對於每個資料,請輸出乙個整數,即答案值。

2

212345

54321

412345

6789a

bcdef

0137f

6

7

對於30%的資料有1≤n≤100

對於全部資料,有1≤n≤100000

一開始打了個正確性顯然為0的貪心trie。

後來才發現正解是搜尋。。。

對於每個點加入進trie裡面,然後dfs兩個子樹,加個最小值ans的剪枝就過了。

時間複雜度o(tn*2^20)。

注意過程比函式要快。

#include#include#include#include#define i int

#define ll long long

#define f(i,a,b) for(i i=a;i<=b;i++)

#define fd(i,a,b) for(i i=a;i>=b;i--)

#define n 100005

using namespace std;

i t,n,p[30],ans,s,x,y,tot,cnt,now,tr[n*20][2];

char c;

void r(i &x)

}void dg(i x,i k,i y,i z)

if(tr[x][0]) dg(tr[x][0],k+1,y,z+((y>>k)&1));

if(tr[x][1]) dg(tr[x][1],k+1,y,z+1-((y>>k)&1));

}void ins(i x)

}i main()

dg(1,0,s,0);

ins(s);

} printf("%d\n",ans);

} return 0;

}

佛山市選2013 海明距離

description 對於二進位制串a,b,他們之間的海明距離是指兩個串異或之後串中1的個數。異或的規則為 0 xor 0 0 1 xor 0 1 0 xor 1 1 1 xor 1 0 計算兩個串之間的海明距離的時候,他們的長度必須相同。現在我們給出n個不同的二進位制串,請計算出這些串兩兩之間的...

3230 佛山市選2013 樹環轉換

給定一棵n個節點的樹,去掉這棵樹的一條邊需要消耗值1,為這個圖的兩個點加上一條邊也需要消耗值1。樹的節點編號從1開始。在這個問題中,你需要使用最小的消耗值 加邊和刪邊操作 將這棵樹轉化為環,不允許有重邊。環的定義如下 1 該圖有n個點,n條邊。2 每個頂點的度數為2。3 任意兩點是可達的。樹的定義如...

佛山市選2013 回文子串行

description 回文序列是指左右對稱的序列。例如1 2 3 2 1是回文序列,但是1 2 3 2 2就不是。我們會給定乙個n m的矩陣,你需要從這個矩陣中找出乙個p p的子矩陣,使得這個子矩陣的每一列和每一行都是回文序列。input 第一行有兩個正整數n,m。接下來是n行,代表乙個n m的矩...