牛客训练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 ...
随机推荐
- T100——接口代码记录,jsonArray和json
{<section id="cs_t1client.description" >} #應用 a00 樣板自動產生(Version:) #+ Version..: T10 ...
- WebMvcConfigurationSupport跨域和fastjson全局替换
@Configuration public class WarnWebMvcConfigurationSupport extends WebMvcConfigurationSupport { /** ...
- Java 集合和泛型
一.集合(Collections) Java使用集合来组织和管理对象. 1.Java的集合类 集合类主要负责保存.盛装和管理对象,因此集合类也被称为容器类. 集合类分为Set.List.Map和Que ...
- Power BI 报表服务器中的行级别安全性 (RLS)
在 Power BI Desktop 中定义角色和规则 你可以在 Power BI Desktop 中定义角色和规则. 发布到 Power BI 时,它还会发布角色定义. 若要定义安全角色,请执行以下 ...
- HTML之盒子变形动画
4个圆形球作圆周运动 代码: <div class="box"> <div class="box1"></div> < ...
- jQuery实现照片墙,附步骤详解
现在一直使用vue写项目,发现之前的js都很生疏了,写个小demo练下手,看一下最终效果展示 功能点:点击添加图片随机添加一张图片,图片可以拖动,可以点击删除 技能点: 主要使用了jQuery的一些方 ...
- 读书笔记《Oracle从入门到精通》
目录 一.SQL基础 1.SQL种类 2.常用数据类型 3.DDL 4.约束 5.DML语句 二.SELECT语句 1.结果集'*'与指定列 2.拼接符 || 3.substr函数 4.instr函数 ...
- SQL 语句外键 a foreign key constraint fails
queryRunner.update("SET FOREIGN_KEY_CHECKS = 0;"); queryRunner.update(sql, pid); queryRunn ...
- sql语句 小记录
select Name '姓名',Age '年龄',(select LessonName + ',' from Lesson where StudentId=s1.Id FOR XML PATH('' ...
- idea管理tomcat
第一步,打开idea的文件——>设置——选择Application Servers: 第二步,点击+号,下拉选择Tomcat Server: 如果已经配置了环境变量CATALINA_HOME,也 ...