https://www.luogu.org/problemnew/show/P4424

题解

我们首先按位考虑。

如果有一位最终的结果为1,那么我们可以把树的序列看成一个二进制数,先出现的在底位,后出现的在高位,操作序列也可以看做一个二进制数,\(and\)为1,\(or\)为0,先出现的在低位,后出现的在高位。

首先操作序列是不可能把0变成1的,那么要使最后的结果为1,就得考虑数字序列最高位的1,那么如果操作序列的更高位有1,结果肯定会变成0,否则如果操作序列这一位不是1,那么结果肯定是1。

如果这两种情况都不是,那么说明这一位操作序列和数字序列都是1,这时就得往低位继续判断。

如此归纳下去,如果需要满足这一位为1,必须要求数字序列>操作序列。

再考虑多位的情况,相当于是有很多的限制。

这样我们就会得到一个性质,合法的序列是一段连续的二进制数。

我们直接把所有序列拍完序后对每个询问暴力扫就好了。

注意边界!!!!

代码

#include<bits/stdc++.h>
#define N 5009
#define M 1009
using namespace std;
typedef long long ll;
const int mod=1000000007;
char s[N];
int n,m,q,rnk[N];
ll ji[N],cnt[N];
inline void MOD(ll &x){x=x>=mod?x-mod:x;}
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
struct skr{int a[M],id;inline bool operator <(const skr &b)const{for(int i=1;i<=n;++i)if(a[i]!=b.a[i])return a[i]>b.a[i];return 0;}
}a[N];
int main(){n=rd();m=rd();q=rd();ji[0]=1;for(int i=1;i<=n;++i)ji[i]=ji[i-1]*2%mod;for(int i=1;i<=n;++i){scanf("%s",s+1);for(int j=1;j<=m;++j){a[j].a[n-i+1]=s[j]^48;}}for(int i=1;i<=m;++i)a[i].id=i;sort(a+1,a+m+1);for(int i=1;i<=m;++i)rnk[a[i].id]=i;for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)if(a[i].a[j])MOD(cnt[i]+=ji[n-j]);for(int j=1;j<=n;++j)MOD(cnt[0]+=ji[n-j]);MOD(cnt[0]+=1);while(q--){scanf("%s",s+1);int L=m+1,R=0;for(int i=1;i<=m;++i)if(s[i]=='1')R=max(R,rnk[i]);else L=min(L,rnk[i]);if(R>L)puts("0");else printf("%lld\n",(cnt[R]-cnt[L]+mod)%mod); }return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10770571.html

HNOI2018寻宝游戏相关推荐

  1. bzoj 5285: [Hnoi2018]寻宝游戏

    Description Solution 把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵 把每一列压成一个二进制数,其中最高位是最下面的元素 然后就有了 \(m\) 个二进制数 ...

  2. [bzoj5285][Hnoi2018]寻宝游戏【复杂度分析】

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5285 [题解] 考虑最后一个影响一个二进制位的数. 如果出现"&0 ...

  3. SDOI2015寻宝游戏 dfs序+set

    SDOI2015寻宝游戏 好像是一道虚树入门题? 虚树???不会不会我弱死了.. Solution: 关键点间的最小路径,就是在保证尽量少走重复路的前提下走出来的一条经过所有关键点的路径. 基于这个思 ...

  4. 河北工业大学c语言寻宝游戏,计算机技术基础(c语言)课程设计寻宝游戏.doc

    计算机技术基础(c语言)课程设计寻宝游戏 计算机技术基础(c语言)课程设计 寻宝游戏 #include #include #include #include #include #define ESC ...

  5. hdu 6289 寻宝游戏

    寻宝游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Sub ...

  6. 寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 - 物联网小游戏

    寻宝游戏 - 利用iBeacon特性设计的iOS线下寻宝游戏 作者简介 科科香,程序员 方向:IoT,方案集成,喜好各种新鲜东东 转载请注明出处 iBeacon简介 iBeacon(下面简称Beaco ...

  7. minecraft_使用MCDungeon将地牢,废墟和寻宝游戏添加到您的Minecraft世界中

    minecraft If you've grown tired of exploring the vanilla Minecraft world and the thrill of stumbling ...

  8. 许嵩续约太合音乐集团 携手开启《寻宝游戏》

    7月24日,许嵩<寻宝游戏>发布会暨续约仪式在北京顺利召开.在推出新专辑<寻宝游戏>之际,也宣布续约太合音乐集团,启动未来"无限"可能. 许嵩畅谈新专< ...

  9. 【BZOJ 3991】 [SDOI2015]寻宝游戏

    3991: [SDOI2015]寻宝游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 251 Solved: 137 [Submit][Status ...

最新文章

  1. java取list中最大数值_Java后台通过Collections获取list集合中最大数,最小数代码
  2. C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
  3. vscode设置eslint检验无效_大整理!JavaScript开发者的27个神奇VSCode工具
  4. 通过COS上传文件至腾讯云
  5. 史上最详细Docker安装Redis (含每一步的图解)实战
  6. oracle9I收缩表,Oracle 9i删除数据表(转)
  7. 还在发愁linux命令记不住吗?神器来了!
  8. 【解题报告】Leecode 35. 搜索插入位置——Leecode刷题系列
  9. c语言访问数据库 不用odbc,急问ODBC访问数据库问题
  10. Windows Vista桌面窗口管理器(3)
  11. 服务器 交换机的维护,服务器路由器交换机维护设置
  12. 当一个人把一个行业说得特别容易赚钱的时候
  13. 利用Adobe AIR本地扩展支持Android开发
  14. Trick (六)——随机图的构造
  15. merge卷积和bn层的原理
  16. 教大家怎么把百度网盘的分享链接共享出来
  17. 百度面试题:求绝对值最小的数
  18. Code Composer Studio设置断点,并不能停在断点的解决办法
  19. Android学习日记(yzy):intent传递的多种数据类型
  20. 查看连接过的WIFI密码方法汇总

热门文章

  1. Asterisk Dial拨号命令中文详解
  2. Fedora7配置简介
  3. 户外运动装备用品大全,户外必备运动耳机分享
  4. Java引用数据类型String详解
  5. 抖音一下,你就涨知识?
  6. VirtualBox命令行工具(VBoxManage)使用,最全最详细
  7. 1、决策树理论知识详解与sklearn实践
  8. Android Studio 编译时app崩溃logcat一闪而过
  9. linux与windows键鼠共享,安装SYNERGY完美配置Windows,Linux共用一套键鼠
  10. 函数指针(指向函数的指针)