對於二進位制串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」。
對於每個資料,請輸出乙個整數,即答案值。
2212345
54321
412345
6789a
bcdef
0137f
6對於30%的資料有1≤n≤1007
對於全部資料,有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的矩...