description 对于二进制串a,b,他们之间的海明距离是指两个串异或之后串中1的个数。异或的规则为:
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0
计算两个串之间的海明距离的时候,他们的长度必须相同。现在我们给出N个不同的二进制串,请计算出这些串两两之间的最短海明距离。
analysis
- 欺诈题
- 可以知道 500 ? 500 500*500 500?500循环,答案大于 3 3 3的几率小于 1 1 0 24 1\over{10^{24}} 10241?
- 【水法|【JZOJ3231】海明距离】数据根本构造不出来,于是水法就可以解决
#include
#include
#include
#define MAXN 100005
#define INF 1000000007
#define ll long long
#define fo(i,a,b) for (ll i=a;
i<=b;
++i)
#define fd(i,a,b) for (ll i=a;
i>=b;
--i)using namespace std;
ll a[20][20],f[MAXN][7];
ll turn[205];
ll n,T,mn;
inline ll read()
{
ll x=0,f=1;
char ch=getchar();
while (ch<'0' || '9'>=1;
}
a[j][i]=a[i][j];
}
}
while (T--)
{
n=read(),mn=INF,scanf("\n");
fo(i,1,n)
{
fo(j,1,5)f[i][j]=turn[getchar()];
scanf("\n");
}
fo(i,1,min(n,400))
{
fo(j,i+1,min(n,400))
{
ll tot=0;
fo(k,1,5)tot+=a[f[i][k]][f[j][k]];
mn=min(mn,tot);
}
}
printf("%lld\n",mn);
}
return 0;
}