d.汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,
我们以d(x,y)表示两个字x,y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。
给出N个串,求出其中最小的汉明距离(其中某2个串的汉明距离是最小的)。
s.随机数法。。。
c.能不能过,看脸。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> using namespace std; int main(){ //cout<<RAND_MAX<<endl;//32767 int T; int N; char str[100005][10]; int num[100005]; int i; int j; int mi; int fuck; int shit; int tmp; int sum; scanf("%d",&T); while(T--){ scanf("%d",&N); for(i=0;i<N;++i){ scanf("%s",str[i]); } memset(num,0,sizeof(num)); for(i=0;i<N;++i){ for(j=0;j<5;++j){ if('0'<=str[i][j]&&str[i][j]<='9'){ num[i]=(num[i]<<4)+(str[i][j]-'0'); } else{ num[i]=(num[i]<<4)+(10+str[i][j]-'A'); } } } mi=21; srand(time(NULL)); for(i=0;i<400005;++i){ fuck=(rand()*rand())%N;//这是个看脸的代码。。。 shit=(rand()*rand())%N; if(fuck==shit){ continue; } tmp=num[fuck]^num[shit]; sum=0; while(tmp>0){ sum=sum+(tmp&1); tmp>>=1; } if(sum<mi){ mi=sum; } } printf("%d ",mi); } return 0; }