最小相似度

  题目大意:对于位数相同的两个二进制串,SIM(A,B)为它们的相似度,也就是A^B中0的个数。现在给定一堆串,找出一个T使得max{SIM(S1,T),SIM(S2,T),......,SIM(Sn,T)}最小,不过不用输出T,只需要输出那个最小值

正解应该是FWT,不过没学过,所以也没做出来,而给出的题解的是用bfs做的,还真没想到能够用搜索做,刚开始看也不理解,不过研究了一下还是,挺好理解的。

  首先,也是为什么可以用bfs的一点,就是串的长度最大只到20,也就是220=1048576种状态,可以通过bfs来遍历,那接下来怎么搜,搜什么呢?

  相似度是A^B中0的个数,但0的个数我们并不好控制,但我们可以控制1的个数,也就是不相似度usim。像(1<<i)就是1在第i位,其他位都是0,那么B=A^(1<<i)的话,B就是A不相似度为1的串,而再有C=B(1<<i)并且C!=A的话,C就是A不相似度为2的串,所以我们就可以像bfs一样一层一层的找到最大的不相似度。而对于多个串的话,就是多起点bfs了。

  那为什么这样可以使,答案刚好是跟多个串的不相似度中的最大的呢?像A=111,B=001的话,A的最大不相似的串是000,但A要第3层才能遍历到000,B第1层就能遍历到000,这样像两边往中间逼近一样,能遍历到的最大的那个不相似度就是对于所有串来说的最大不相似度

  最后,再拿长度减去最大不相似度就可以得到最小相似度了,详情见代码

 #include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=<<;
char s[];
int n,m,usim[N];
int main()
{
memset(usim,-,sizeof(usim));
scanf("%d%d",&n,&m);
queue<int> q;
for(int i=;i<n;i++)
{
scanf("%s",s);
int x=;
for(int j=;j<m;j++)
x=(x<<)|(s[j]-'');//将串转换成数字表示状态
if(usim[x]==-)
{
usim[x]=;//自己和自己的不相似度为0
q.push(x);//多起点
}
}
int ans=;
while(!q.empty())
{
int x=q.front();
q.pop();
if(usim[x]>ans)
ans=usim[x];//找到最大不相似度
for(int i=;i<m;i++)
{
int y=x^(<<i);//y是x第i位取反的结果
if(usim[y]==-)
{
usim[y]=usim[x]+;//所以y与起点串的不相似度就是x的+1
q.push(y);
}
}
}
printf("%d\n",m-ans);
return ;
}

再偷懒就就就自己打自己

牛客训练41D最小相似度bfs的更多相关文章

  1. 牛客网挑战赛24 青蛙(BFS)

    链接:https://www.nowcoder.com/acm/contest/157/E来源:牛客网 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始踏上了旅途 一直这 ...

  2. 牛客 小a与星际探索 bfs

    链接:https://ac.nowcoder.com/acm/contest/317/C?&headNav=acm来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  3. 牛客训练21674——牛牛与LCM

    Problem 链接:https://ac.nowcoder.com/acm/problem/21674 来源:牛客网 牛牛最近在学习初等数论,他的数学老师给他出了一道题,他觉得太简单了, 懒得做,于 ...

  4. 牛客练习赛41D(思维转化)

    AC通道 要点 思路:题解中将所求进行转化\[max\{相似度\} = max\{M-不相似度\} = M-min\{不相似度\}\]因此转化为求某01串T与所给众S串的最小不相似度,而最终答案是选取 ...

  5. 牛客训练五:炫酷路途(c++与dp)

    题目链接:传送门 思路:每隔2^i(0<=i<=INF)就有一条路径,所以可以将从头到尾的路线视为一个有向图, 将ai,bi以此输入,然后将路径从小到大排序,不断更新路径. __built ...

  6. 牛客提高D1t2 最小生成链

    分析 我们发现可以把题目转化为:有一个序列a,问它的排列中相邻两个值异或的最大值的最小值 我们发现序列的构成一定是前几位全是一样的 从某一位开始左面全是0右面全是1 所以只要找到一种方案是的交界两个值 ...

  7. 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心

    Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...

  8. 牛客训练赛25-A-最长区间

    https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...

  9. 牛客训练赛25-A-因数个数

    题目链接https://www.nowcoder.com/acm/contest/158/A 无语...这题很迷啊,原谅我的菜,刚开始想用预处理欧拉筛和前缀和,可是这题太血崩了,这样一样要遍历,1-e ...

随机推荐

  1. 怎样理解NodeList的动态集合与静态集合

    NodeList 有两种, 一种是动态集合, 一种是静态集合, 所谓动态集合, 主要是 Node.prototype.childNodes; 返回的子节点集合对文档的节点增删改会即时改变; 而静态集合 ...

  2. C#面向对象17 23种设计模式

    1.简单工厂模式 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  3. swagger 报错打不开

    1.controller中的接口里使用的 qto的数据类型有问题: qo中的字段中缺少:(@JsonProperty(value = "sort"),以及定义的example值的格 ...

  4. C#文本转换为Json格式

    private string ConvertJsonString(string str)        {            //格式化json字符串            JsonSeriali ...

  5. React学习——通过模态框中的表单,学习父子组件之间传值

    import { Button, Modal, Form, Input, Radio } from 'antd'; const CollectionCreateForm = Form.create({ ...

  6. vue中的常用三元

    点击事件的三元 <el-button type="primary" @click="edit == 'mod' ? sureModify() : submit()& ...

  7. mint-ui下拉加载(demo实例)

    <template> <div class="share"> <div class="header"> <div cl ...

  8. asp.net中的比较完美的验证码

    要实现如图的效果的验证码,分以下步骤: 第一.布局好调用验证码的登录页面(命名:Login.aspx),注意:验证码位置可以是服务器控件 Image,也可以是html标签写的<img>,但 ...

  9. python:常用模块 知识整理

    time模块 time.time() # 时间戳:1487130156.419527 time.strftime("%Y-%m-%d %X") #格式化的时间字符串:'2017-0 ...

  10. Redis+Sentinel安装与配置

    在这里我们搭建的是一个1主3从的redis+3个哨兵集群的环境,由于是在一台物理机上,所有我们用端口区分. 物理机IP:192.168.0.12 主节点master端口:6301 从节点slave1端 ...