/*************************************************************************
> Author: MentalOmega
> Mail: 965194745@qq.com
> Created Time: 2017年10月14日
> function:这道题的题意说的是给出n个二进制串,求取一个字符串与n个字符串的相似度最大值最小
相似度的定义是异或值小的相似度高。
做法是把每一个二进制看成一个点,然后状态转移是改变一位,相似距离加1,变得更不相似,这样用BFS的方式来算出其他
所有二进制串的最短距离,那么在所有距离中取一个最大的,这个串距离距离他最近的原串(相似度最高的)相似距离最远,也就是相似度最小,就是答案。
************************************************************************/
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXM = (1<<20)+10;
const int MAXN = 1e5+10;
int dis[MAXM];
int n,k;
bitset<25> str[MAXN];
void bfs()
{
queue<int> que;
memset(dis,INF,sizeof dis);
for(int i=0;i<n;i++)
{
int num=(int)str[i].to_ulong();//使用了bitset的2进制转十进制
dis[num]=0;
que.push(num);
}
while(que.size())
{
int u=que.front();
que.pop();
for(int i=0;i<k;i++)
{
int v=u^(1<<i);
if(dis[v]>dis[u]+1)
{
dis[v]=dis[u]+1;
que.push(v);
}
}
}
}
int main()
{
if (fopen("in.txt", "r") != NULL)
{
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
}
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>str[i];
}
bfs();
int mx=0,id=0;
for(int i=0;i<MAXM;i++)
{
if(dis[i]==INF) continue;
if(dis[i]>mx)
{
mx=dis[i];
id=i;
}
}
bitset<25> out(id);
for(int i=k-1;i>=0;i--)
cout<<out[i];
return 0;
}
Kattis - distinctivecharacter
最新推荐文章于 2021-07-28 23:15:45 发布