Description:

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

Hint:

\(n<=1000,m<=5000,q<=1000\)

Solution:

按位考虑

把这些串按位拆成m个长为n的串

发现只有\(|1\)和\(\&0\)会改变答案

且每一位最终为1的充要条件是最后一个\(|1\)在\(\&0\)后

为0则反之

再将操作序列也看成01串

\(|\)为\(0,\&\)为\(1\),

则问题转化为原串与操作串的字典序大小关系

每次找到操作串的上界和下界,相减便是答案

#include<bits/stdc++.h>
using namespace std;
const int mxn=5e3+5,mod=1e9+7;
int n,m,q;
int t[mxn][mxn],s[mxn],rk[mxn],p[mxn];
char c[mxn]; int cmp(int a,int b)
{
for(int i=1;i<=n;++i)
if(t[a][i]!=t[b][i]) return t[a][i]<t[b][i];
return 0;
} void init()
{
p[0]=1;
for(int i=1;i<=mxn-5;++i) p[i]=1ll*p[i-1]*2%mod;
for(int i=1;i<=m;++i) reverse(t[i]+1,t[i]+n+1);
for(int i=1;i<=m;++i) rk[i]=i;
sort(rk+1,rk+m+1,cmp);
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
s[i]=(s[i]+1ll*t[rk[i]][j]*p[n-j])%mod; //预处理,按字典序排序后每次能按顺序扫
s[m+1]=p[n];
} void solve()
{
for(int i=1;i<=q;++i) {
scanf("%s",c+1);
int st=0,ed=m+1;
for(int i=m;i>=1;--i) if(c[rk[i]]=='0') {st=i;break;}
for(int i=1;i<=m;++i) if(c[rk[i]]=='1') {ed=i;break;} //找上下界
printf("%d\n",ed>=st?(s[ed]-s[st]+mod)%mod:0);
}
} int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;++i) {
scanf("%s",c+1);
for(int j=1;j<=m;++j)
t[j][i]=c[j]-'0';
}
init();
solve();
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. HNOI2018寻宝游戏

    https://www.luogu.org/problemnew/show/P4424 题解 我们首先按位考虑. 如果有一位最终的结果为1,那么我们可以把树的序列看成一个二进制数,先出现的在底位,后出 ...

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

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

  7. 【比赛】HNOI2018 寻宝游戏

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

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

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

  9. 【题解】HNOI2018寻宝游戏

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

随机推荐

  1. C++ Primer 笔记——嵌套类 局部类

    1.嵌套类是一个独立的类,与外层类基本没什么关系.特别的是,外层类的对象和嵌套类的对象是相互独立的.在嵌套类的对象中不包含任何外层类定义的成员,在外层类的对象中也不包含任何嵌套类定义的成员. 2.嵌套 ...

  2. java 学习中出过的错误

    1. 运行异常 C:\Users\plan-B\java>java TapeDeckTestDrive.class 错误: 找不到或无法加载主类 TapeDeckTestDrive.class

  3. python is和==的区别

    # ==和is # ==用来判断值是否相等# is是用看来判断是不是指定了同一个东西,判断是不是指向了同一个地址等 a = [11,22,33]b = [11,22,33] a == b # True ...

  4. .NET Framework 类库——C#命名空间大全

    引用地址:https://msdn.microsoft.com/zh-cn/library/gg145045.aspx C# using引用时,不知道有哪些命名空间,这下转载收集一篇,方面查找使用. ...

  5. win10ssh连接ubuntu服务器并本地绘图

    update @ 2018-11-07 00:36:38 用xrdp+tigervnc等的组合,可以使用原生unity桌面.具体教程见ubuntu日常使用指南 工具准备 win10上: xshell, ...

  6. ubuntu中vim下按上下左右键时输入A、B、C、D

    ubuntu系统自带的 vi 不完整导致,解决方法:安装完整的vi $ sudo apt-get install vim-gtk 1. 为root用户设置密码 sudo passwd root 需要先 ...

  7. jquery表单提交的新写法

    $('form').submit()和$("form").submit() 这两种都可以实现form表单的提交 jquery中$('form').submit()和$(" ...

  8. 完美解决gradle下载慢的问题

    修改项目根目录下的文件 build.gradle ,使用国内阿里云镜像仓库地址. buildscript { repositories { maven{ url 'http://maven.aliyu ...

  9. HTML5语音输入方法

    谷歌的网站是时逛时新啊,今天在他们首页发现了HTML5的新玩法——语音搜索.可惜的是只有webkit核心的浏览器才能使用.用法很简单只需要在input添加属性 x-webkit-speech 即可,例 ...

  10. 最大子数组(I, II, III,IV,V)和最大子数组乘积 (动态规划)

    I 找一个连续最大子数组,sum加到nums[i], 如果前面子数组和<0则舍去,从头开始. class Solution { public: /** * @param nums: A list ...