点此看题面

大致题意: 给你\(n\)个\(m\)位二进制数。每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案能够得到给你的这个二进制数。

找规律

不难想到去对每一位分别讨论。

则根据位运算法则可得:

  • 当你把某一位的数\(and\ 0\),就相当于把这一位数赋值为\(0\)。
  • 当你把某一位的数\(or\ 1\),就相当于把这一位数赋值为\(1\)。
  • 当你把某一位的数\(and\ 1\)或者\(or\ 0\)时,这一位的值均不变。

则可以得出一个结论:

  • 若给定数这一位为\(0\),则对于这一位的运算中最后一次\(and\ 0\)要出现在最后一次\(or\ 1\)之后(或者两者都未出现)。
  • 若给定数这一位为\(1\),则对于这一位的运算中最后一次\(or\ 1\)要出现在最后一次\(and\ 0\)之后(注意\(or\ 1\)必须有,\(and\ 0\)可有可无)。

但这样依然不太好操作,所以我们要进行进一步转化。

转化

考虑把操作序列转化为一个二进制数,\(or\)为\(0\),\(and\)为\(1\),且较后操作处于较高位。

然后把题目中给出的\(n\)个长度为\(m\)的数变为\(m\)个长度为\(n\)的数,第\(i\)个数由初始的\(n\)个数的第\(i\)位组成,且编号较大的数处于较高位。

这样一来操作与数就可以一一对应了。

然后考虑如果对应位相等,表示该操作无影响。

而不相等那一位,若操作序列中的值为\(0\),数中的值为\(1\),即操作序列中这一位小于该数中的这一位,说明是赋值为\(1\),反之是赋值为\(0\)。

由于二进制下比大小看不相等的最高位,所以我们可以得出结论:

  • 若操作序列所表示的二进制数小于该数,则最终结果中该数所对应位上为\(1\)(不能等于是因为一定要有\(or\ 1\)操作)。
  • 若操作序列所表示的二进制数大于等于该数,则最终结果中该数所对应位上为\(0\)。

也就是说,一个符合条件的操作序列所表示的二进制数,要满足其小于所有应得位为\(1\)的数,大于等于所有应得位为\(0\)的数。

而这也就是要小于所有应得位为\(1\)的数的最小值,大于等于所有应得数为\(0\)的数的最大值。

则可以先将所有数排序,然后求出所有数取模后的值,然后对于询问从小到大找最大值,从大到小找最小值即可。

具体实现详见代码。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 1000
#define M 5000
#define X 1000000007
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,m,v[M+5],pw[M+5];
struct data
{
int p;string s;
I bool operator < (Con data& o) Con {return s<o.s;}
}s[M+5];
I int XSub(CI x,CI y) {return x<y?x-y+X:x-y;}
int main()
{
RI Qt,i,j,l,r;string st;for(scanf("%d%d%d",&n,&m,&Qt),i=1;i<=m;++i) s[i].p=i;//初始化
for(i=1;i<=n;++i) for(cin>>st,j=1;j<=m;++j) s[j].s=st[j-1]+s[j].s;//初始化出字符串
for(pw[0]=i=1;i<=n;++i) (pw[i]=pw[i-1]<<1)>=X&&(pw[i]-=X);v[m+1]=pw[n];//预处理2的幂
for(sort(s+1,s+m+1),i=1;i<=m;++i) {for(j=0;j^n;++j) s[i].s[j]^48&&Inc(v[i],pw[n-j-1]);}//排序,预处理出每个数的值
W(Qt--)
{
for(cin>>st,l=0,i=m;i;--i) if(st[s[i].p-1]^'1') {l=i;break;}//找最小值
for(r=m+1,i=1;i<=m;++i) if(st[s[i].p-1]^'0') {r=i;break;}//找最大值
printf("%d\n",l<=r?XSub(v[r],v[l]):0);//计算答案
}return 0;
}

【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)的更多相关文章

  1. [Bzoj5285][洛谷P4424][HNOI/AHOI2018]寻宝游戏(bitset)

    P4424 [HNOI/AHOI2018]寻宝游戏 某大学每年都会有一次Mystery Hunt的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为新生 ...

  2. 洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)

    题意 题目链接 Sol 神仙题Orz Orz zbq爆搜70.. 考虑"与"和"或"的性质 \(0 \& 0 = 0, 1 \& 0 = 0\) ...

  3. 【洛谷4424】[HNOI_AHOI2018]寻宝游戏(我也不知道括号里该写啥)

    题目 洛谷 4424 分析 感觉思路比较神仙. 对于按位与和按位或两种运算,显然每一位是独立的,可以分开考虑. 对于某一位,「与 \(0\)」会将这一位变成 \(0\),「或 \(1\)」会将这一位变 ...

  4. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...

  5. [洛谷P4436] HNOI/AHOI2018 游戏

    问题描述 一次小G和小H在玩寻宝游戏,有n个房间排成一列,编号为1,2,...,n,相邻的房间之间都有一道门.其中一部分门上锁(因此需要有对应的钥匙才能开门),其余的门都能直接打开.现在小G告诉了小H ...

  6. 【洛谷P2114】起床困难综合征 位运算+贪心

    题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...

  7. 洛谷 P2114 [NOI2014]起床困难综合症 位运算

    题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...

  8. NOI2014 洛谷P2114 起床困难综合征(位运算)

    呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...

  9. 洛谷P4438 [HNOI/AHOI2018]道路(dp)

    题意 题目链接 Sol 每当出题人想起他出的HNOI 2018 Day2T3,他都会激动的拍打着轮椅 读题比做题用时长系列... \(f[i][a][b]\)表示从根到\(i\)的路径上,有\(a\) ...

随机推荐

  1. mysql安装等操作

    CentOS 6.5系统中安装配置MySQL数据库 卸载掉原有mysql rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 rpm -e my ...

  2. Ryzen 移动平台上安装 Gentoo Linux

    Linux 内核对于跟进支持 Ryzen 移动低压 CPU 的热情似乎和市面上寥寥无几的 Ryzen 笔记本热度十分吻合.虽然从 Linux 4.11 起就对 Ryzen 桌面 CPU 有较好的支持, ...

  3. cmd与bat脚本的使用

    零. bat cmd 命令大全 bat命令大全学习 一..定位到当前路径 1.定位到当前路径 2.方法二 3.win10下面 通解: %windir%\system32\cmd.exe 二 .使用命令 ...

  4. unique key 唯一约束

    #添加唯一约束mysql> alter table tb2    -> add unique key(name)   ->;#删除唯一约束mysql> alter table ...

  5. Codeforces Round #363 (Div. 2) A

     Description There will be a launch of a new, powerful and unusual collider very soon, which located ...

  6. Codeforces Round #365 (Div. 2) A

    Description Mishka is a little polar bear. As known, little bears loves spending their free time pla ...

  7. A -- A. Quailty and Playing Cards 模拟 + 思考

    http://www.ifrog.cc/acm/problem/1036?contest=1005&no=0 分类,考虑Q神出的是第一张或者是第二张,然后对手出那些牌来应付. Q神出第一张和第 ...

  8. 使用tortoise git将一个现有项目推送到远程仓库

    一.安装文件: 1.git https://git-scm.com/downloads 2.tortoise git https://tortoisegit.org/download/ 二.将一个现有 ...

  9. Spring和springMVC父子容器的关系

    部分转载自:https://www.cnblogs.com/ljdblog/p/7461854.html springMVC容器和Spring容器 为什么一定要在web.xml中配置spring的li ...

  10. PHP 中获取文件名及路径

    1. basename("/mnt/img/image01.jpg")函数:得到文件名;输出结果为:image01.jpg. 使用 basename($uriString) 我们可 ...