免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
[Trie]JZOJ 3231 【佛山市選2013】海明距離

Description

對于二進制串a(chǎn),b,他們之間的海明距離是指兩個串異或之后串中1的個數(shù)。異或的規(guī)則為:

0?XOR?0?=?0

1?XOR?0?=?1

0?XOR?1?=?1

1?XOR?1?=?0

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

Input

第一個數(shù)字是整數(shù)T(T≤10),代表數(shù)據(jù)的組數(shù)。

接下來有T組數(shù)據(jù),每組數(shù)據(jù)的第一行是一個正整數(shù)N,代表不同的二進制串的個數(shù)。接下來是N行,每行都是一個二進制串(長度是5)。我們用數(shù)字(0-9)和字符(A-F)來表示這個二進制串。它代表這個二進制串的16進制碼。例如,“12345”代表的二進制串為“00010010001101000101”。?

Output

對于每個數(shù)據(jù),請輸出一個整數(shù),即答案值。
?

Sample Input

2
2
12345
54321
4
12345
6789A
BCDEF
0137F

Sample Output

6
7
?

Data Constraint

對于30%的數(shù)據(jù)有1≤N≤100

對于全部數(shù)據(jù),有1≤N≤100000

?

?分析

第一眼看多條串,比較,那就建個Trie樹

然后一想,不對!怎么搞串中不同的部分呢?

然后就打出了很暴力的每次加串遍歷一遍Trie樹,然后用當前最優(yōu)答案剪枝

跑滿不到O(n^2),但我覺得會超時

(事實上好像可證時間復(fù)雜度是在小數(shù)據(jù)和大數(shù)據(jù)中優(yōu),中數(shù)據(jù)表現(xiàn)差的)

小數(shù)據(jù)不用說肯定優(yōu)

大數(shù)據(jù)串多,保證不相同,則不同個數(shù)會減少,減少后遍歷時容易被剪枝剪掉

然后出來一看,數(shù)據(jù)純隨機……欺詐題啊

?

#include <iostream>#include <cstdio>#include <cstring>#include <memory.h>using namespace std;const int N=1e5 10;int T,n;int a[N],b[21],t[2097153][2],end[2097153];int cnt,calc,lans;void Find(int k,int x,int dep) {    if (end[x])    {        lans=calc;        return;    }    if (calc>=lans) return;    for (int i=0;i<2;i  )        if (t[x][i]) {            if (b[dep 1]!=i) calc  ;            Find(k,t[x][i],dep 1);            if (b[dep 1]!=i) calc--;        }}void Insert(int k) {    int now=0;    for (int i=1;i<=20;i  ) {        if (!t[now][b[i]]) now=t[now][b[i]]=  cnt;        else now=t[now][b[i]];    }    end[now]=1;}int main() {    for (scanf("%d",&T);T;T--) {        scanf("%d",&n);        memset(t,0,sizeof t);lans=2147483647;cnt=0;memset(end,0,sizeof end);        for (int i=1;i<=n;i  ) {            char c[10];            scanf("%s",c 1);            int len=strlen(c 1);            a[i]=0;            for (int j=1;j<=len;j  )                if (c[j]>='0'&&c[j]<='9') a[i]=a[i]*16 c[j]-'0';                else a[i]=a[i]*16 c[j]-'A' 10;            for (int j=1;j<=20;j  ) b[20-j 1]=a[i]%2,a[i]/=2;            Find(i,0,0);            Insert(i);        }        if (n==1) printf("0\n");        else printf("%d\n",lans);    }}
View Code

?

來源:https://www.icode9.com/content-4-281651.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
513,漢明距離
LuoguP6218 [USACO06NOV] Round Numbers S
NOIP訓(xùn)練營集訓(xùn)筆記-狀態(tài)壓縮DP
位操作運算的奇技淫巧!(附源碼)
程序人生丨2021年最常用將會是這 8 種數(shù)據(jù)結(jié)構(gòu)算法,一定要了解
CRC原理的理解與C語言
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服