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;
}

HNOI2018寻宝游戏的更多相关文章

  1. 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)

    [BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...

  2. 5285: [Hnoi2018]寻宝游戏

    5285: [Hnoi2018]寻宝游戏 链接 分析: 从下面依次确定运算符号,然后在确定的过程中,需要确定的位数会逐渐减少.比如最后有一个1,如果在从下往上确定了一个or 1,那么再往前可以随便选了 ...

  3. BZOJ.5285.[AHOI/HNOI2018]寻宝游戏(思路 按位计算 基数排序..)

    BZOJ LOJ 洛谷 话说vae去年的专辑就叫寻宝游戏诶 只有我去搜Mystery Hunt和infinite corridor了吗... 同样按位考虑,假设\(m=1\). 我们要在一堆\(01\ ...

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

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

  5. bzoj千题计划310:bzoj5285: [Hnoi2018]寻宝游戏(思维题+哈希)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 |0 和 &1 没有影响 若填‘|’,记为0,若填‘&’,记为1 先只考虑最 ...

  6. [HNOI2018]寻宝游戏

    Description: 给出\(n\)个长为\(m\)的01串,第0个为0,同时给出\(q\)个询问串,每次向其中添加\(n\)个\(\&\)或\(|\)符号,求使这些串按顺序运算得到询问串 ...

  7. 【比赛】HNOI2018 寻宝游戏

    考试的时候就拿了30points滚粗了 听说myy对这题的倒推做法很无奈,官方题解在此 正解思路真的很巧妙,也说的很清楚了 就是分别考虑每一位,会发现题解中的那个性质,然后把询问的二进制数按照排序后的 ...

  8. [HNOI2018]寻宝游戏(题解转载自别处)

    题解(自别处转载): Luogu CSDN 这题关键是将运算符也替换成0,1 然后在运算符与原串混杂里找规律. 而且替换的方式也有所要求,考场上两种替换方式都要尝试. #include <bit ...

  9. 【题解】HNOI2018寻宝游戏

    太厉害啦……感觉看到了正解之后整个人都惊呆了一样.真的很强%%% 首先要注意到一个性质.位运算列与列之间是不会相互影响的,那么我们先观察使一列满足条件的操作序列需要满足什么条件.&0时,不论之 ...

随机推荐

  1. sql 修改、更新、替换 某个字段的部分内容(转载)

    来源:https://blog.csdn.net/jiangnanqbey/article/details/81304834 1*.需求 将表(Ws_FormMain)的字段(order_Number ...

  2. int-Integer-String之间的转换方式

    1.int和Integer之间的转换:   1) int----->Integer ①自动装箱 ②Integer的构造方法 ③调用Integer的静态方法:static Integer valu ...

  3. int 与 Integer 的区别

    int和Integer的区别 Integer是int的包装类,int则是java的一种基本数据类型 Integer变量必须实例化后才能使用,而int变量不需要 Integer实际是对象的引用,当new ...

  4. JavaScript学习一之数据校验

    JavaScript页面进行数据校验 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  5. Django 无名参数与有名参数

    无名参数 配置 urls ,我们需要导入 url 模块,以()定义一个无名的变量 from django.contrib import admin from django.urls import pa ...

  6. arcgis api 3.x for js 实现克里金插值渲染图不依赖 GP 服务(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  7. typescript中类的继承

    typescript中类的继承用到的是:extends和super 先看一下typescript中类的写法: class Demo{ //类的属性 name:string; age:number; / ...

  8. js 学习之路10:try异常处理和第一个js小程序

    try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. 1. try/catch语句 catch语句用来捕获try代码块中的错误,并执行自定义的语句来处理它. 语 ...

  9. 初步了解PE分析

    尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...

  10. java 位运算符 以及加法 交换两个变量值

    先给出十转二的除法 2       60 30       0 15 0 7 1 3 1 1  1 0  1 60转二 111100 再介绍位运算符 a=60 b=13 A = 0011 1100 B ...