牛客训练41D最小相似度bfs
题目大意:对于位数相同的两个二进制串,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的更多相关文章
- 牛客网挑战赛24 青蛙(BFS)
链接:https://www.nowcoder.com/acm/contest/157/E来源:牛客网 有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟.于是便开始踏上了旅途 一直这 ...
- 牛客 小a与星际探索 bfs
链接:https://ac.nowcoder.com/acm/contest/317/C?&headNav=acm来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...
- 牛客训练21674——牛牛与LCM
Problem 链接:https://ac.nowcoder.com/acm/problem/21674 来源:牛客网 牛牛最近在学习初等数论,他的数学老师给他出了一道题,他觉得太简单了, 懒得做,于 ...
- 牛客练习赛41D(思维转化)
AC通道 要点 思路:题解中将所求进行转化\[max\{相似度\} = max\{M-不相似度\} = M-min\{不相似度\}\]因此转化为求某01串T与所给众S串的最小不相似度,而最终答案是选取 ...
- 牛客训练五:炫酷路途(c++与dp)
题目链接:传送门 思路:每隔2^i(0<=i<=INF)就有一条路径,所以可以将从头到尾的路线视为一个有向图, 将ai,bi以此输入,然后将路径从小到大排序,不断更新路径. __built ...
- 牛客提高D1t2 最小生成链
分析 我们发现可以把题目转化为:有一个序列a,问它的排列中相邻两个值异或的最大值的最小值 我们发现序列的构成一定是前几位全是一样的 从某一位开始左面全是0右面全是1 所以只要找到一种方案是的交界两个值 ...
- 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心
Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...
- 牛客训练赛25-A-最长区间
https://www.nowcoder.com/acm/contest/158#question 这题问最长的严格连续递增序列的最长长度是多少? 最开始感觉这道题不可做,因为有1e5个点,还有1e5 ...
- 牛客训练赛25-A-因数个数
题目链接https://www.nowcoder.com/acm/contest/158/A 无语...这题很迷啊,原谅我的菜,刚开始想用预处理欧拉筛和前缀和,可是这题太血崩了,这样一样要遍历,1-e ...
随机推荐
- Centos7.3安装Oracle11.2.0.3
1.创建用户用户组 [root@smallcloud ~]# groupadd oinstall [root@smallcloud ~]# groupadd dba [root@smallcloud ...
- C#面向对象21 接口
接口的规范: 1.接口是一种规范.只要一个类继承了一个接口,这个类就必须实现这个接口中所有的成员. 2.为了多态,接口不能被实例化,接口不new(不能创建对象) 3.接口中的成员不能加“访问修饰符”, ...
- 【原创】运维基础之Amplify
官方:https://www.nginx.com/products/nginx-amplify/ NGINX Amplify is a SaaS‑based monitoring tool for t ...
- nginx之配置
1)反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端, ...
- 最新Cocoapods 安装及使用
1.移除现有Ruby默认源 gem sources --remove https://rubygems.org/ 2.使用新的源 gem sources -a https://ruby.taobao. ...
- python连接oracle导出数据文件
python连接oracle,感觉table_list文件内的表名,来卸载数据文件 主脚本: import os import logging import sys import configpars ...
- GDI+ 绘图教程 验证码
使用的 C# winform using System; using System.Collections.Generic; using System.ComponentModel; using Sy ...
- Windows环境中编译opencv3.0同时加入OPENCV_contrib库及解决遇到相关问题[contrib 必须要3.1以上的opencv才支持了]
更新:现在contrib库必须要opencv3.1以上才能支持编译通过了. 方法和步骤还是和本篇文章一样. ############################################## ...
- Win10应用商店缓存信息多如何去清理?
Win10系统的应用商店相比之前有了许多的更新,微软也成立了专门的团队准备对应用商店进行完善,但是我们在使用应用商店的过程中会产生许多缓存文件,占用电脑空间资源,也会影响电脑的运行速度. 下面好系统重 ...
- GMT、UTC、UNIX时间戳、时区
GMT.UTC.CTS: UTC时间:世界协调时间(UTC)是世界上不同国家用来调节时钟和时间的主要时间标准,也就是零时区的时间.UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统 ...