description
對於二進位制串a,b,他們之間的海明距離是指兩個串異或之後串中1的個數。異或的規則為:
0 xor 0 = 0
1 xor 0 = 1
0 xor 1 = 1
1 xor 1 = 0
計算兩個串之間的海明距離的時候,他們的長度必須相同。現在我們給出n個不同的二進位制串,請計算出這些串兩兩之間的最短海明距離。
input
第乙個數字是整數t(t≤10),代表資料的組數。
接下來有t組資料,每組資料的第一行是乙個正整數n,代表不同的二進位制串的個數。接下來是n行,每行都是乙個二進位制串(長度是5)。我們用數字(0-9)和字元(a-f)來表示這個二進位制串。它代表這個二進位制串的16進製製碼。例如,「12345」代表的二進位制串為「00010010001101000101」。
output
對於每個資料,請輸出乙個整數,即答案值。
sample input
26789a
bcdef
0137f
sample output
6data constraint
對於30%的資料有1≤n≤100
對於全部資料,有1≤n≤100000..
...分析
演算法一:暴力求解,n個數兩兩異或之後轉換成二進位制計算有多少個一。o(n^2 log a),a表示異或後的數。預計得分30。
演算法二:異或是可逆的,根據這一性質,我們可以反過來列舉異或後的值s,s最多有2^20種情況。
當s^ c=d,c為輸入中給出的數,如果d也在題目給出的數當中,那麼s就是乙個合法解。但是實際上,這樣做的時間複雜度是o(2^20*n),極限資料中,相比演算法一,並沒有多少優勢。所以這個方法是需要優化的。
怎麼優化?很容易想到,如果搜尋過程中已經得出了最小的解ans,那麼當s當中1的個數》=ans時,我們就可以剪枝了。但是,理論複雜度還是o(2^20*n),因為我們不能確保這個剪枝能起很大作用(如果你搜到的答案是從大到小的,那就沒辦法剪枝了)。
所以,我們構造s的次序可以調整一下:按照1的個數從少到多的順序。那麼我們找到了第乙個解之後就可以肯定,它就是最終答案。
至於證明……只能說:如果出題人出人工資料來卡暴力的話,並不能使n=10000,ans=20,因為這些數字兩兩不重複,所以當ans=20,n必定為2。以此類推……極限資料不會太坑。..
...程式:
#include#include#includeusing namespace std;
int n,bz;
long long a[100010];
char s[100010],p[3000010];
long long turn(char *s)
bool work(int x,int y,int l,int r)
for (int i=y+1;i<=20;i++)
return false;
}int main()
p[a[i]]=true;
} if (bz==true) continue;
int ans=1;
while (1) if (work(0,-1,1,ans)==true) break; else ans++;
printf("%d\n",ans);
} return 0;
}
3231 佛山市選2013 海明距離
對於二進位制串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的矩...