太厉害啦……感觉看到了正解之后整个人都惊呆了一样。真的很强%%%

  首先要注意到一个性质。位运算列与列之间是不会相互影响的,那么我们先观察使一列满足条件的操作序列需要满足什么条件。&0时,不论之前是什么数字,结果都是0,而|1时,结果都是1。我们现在将&用1表示,而|用0表示。这样我们将我们&|的操作序列转化为了一个01串。假设这一列数字操作出来做后的结果应当是1,显然有最后的一个|1在&0之后。我们比较一下两个串,同为1或者同为0则跳过(&1 和 |0 不影响数字的大小),然后当出现操作序列是1而数字序列是0时,就一定不合法;反之则一定合法(|1 和 &0 谁先出现)。

  写到这里不知道有没有感觉出一点什么?其实就是在比较两个串的字典序啊。结果为1:操作串字典序 < 数字序列字典序;结果为0 :操作串字典序 >= 数字序列字典序。到这里正解就呼之欲出了:将所有的数字串(一列上的)按反序(自底向上)字典序排列,此后只要求出临界的两个字符串,答案就是这两个字符串的数字差啦。

#include <bits/stdc++.h>
using namespace std;
#define maxn 1105
#define maxm 5105
#define mod 1000000007
#define ll long long
#define int long long
ll n, m, q, sum[maxm], MAXX;
char Q[maxm], S[maxm]; struct node
{
int id;
char a[maxn];
}ch[maxm]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} bool cmp(node a, node b)
{
for(int i = ; i <= n; i ++)
{
int k1 = a.a[i] - '', k2 = b.a[i] - '';
if(k1 == k2) continue;
else if(k1 > k2) return ;
else return ;
}
} ll Get_num(int x) //y - x
{
int ret1 = ;
for(int i = ; i <= n; i ++)
{
ret1 = ret1 * % mod;
if(ch[x].a[i] - '') ret1 += ;
}
return ret1;
} ll Qpow(int x, int t)
{
ll base = ;
for(; t; t >>= , x = (x * x) % mod)
if(t & ) base = (base * x) % mod;
return base;
} signed main()
{
n = read(), m = read(), q = read();
MAXX = Qpow(, n);
for(int i = ; i <= n; i ++)
{
scanf("%s", S + );
for(int j = ; j <= m; j ++)
ch[j].a[n - i + ] = S[j];
}
for(int i = ; i <= m; i ++) ch[i].id = i;
sort(ch + , ch + + m, cmp);
for(int i = ; i <= m; i ++)
sum[i] = Get_num(i);
for(int i = ; i <= q; i ++)
{
scanf("%s", Q + );
int mark1 = , mark2 = ;
for(int j = ; j <= m; j ++)
if(Q[ch[j].id] - '')
{
mark1 = j;
break;
}
for(int j = m; j >= ; j --)
{
if(!(Q[ch[j].id] - ''))
{
mark2 = j;
break;
}
}
if(mark1 && mark2 && mark2 >= mark1) printf("0\n");
else
{
if(mark1) printf("%lld\n", (sum[mark1] - sum[mark2] + mod) % mod);
else if(!mark1 && mark2) printf("%lld\n", (MAXX - sum[mark2] + mod) % mod);
else printf("%lld\n", MAXX);
}
}
return ;
}

【题解】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. [HNOI2018]寻宝游戏(题解转载自别处)

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

  5. HNOI2018寻宝游戏

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

  6. 【比赛】HNOI2018 寻宝游戏

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

  7. loj2494 [hnoi2018]寻宝游戏

    题意:给你n个元素的数组a.你可以在每个元素之前添加and和or的符号.每次询问最后变成r有多少种添号情况. n<=1000,m<=5000,q<=1000. 标程: #includ ...

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

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

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

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

随机推荐

  1. InheritableThreadLocal线程复用

    引自:http://www.cnblogs.com/sweetchildomine/p/6575666.html 虽然使用AOP可以获取方法签名,但是如果要获取方法中计算得出的数据,那么就得使用Thr ...

  2. vertical-align垂直居中

    <div id="content"> <div id="weizi"> 锄禾日当午,<br> 汗滴禾下土.<br> ...

  3. Test类实验

    package PC_TEST; class CPU{ int speed; CPU(){ speed=0; } CPU(int k){ speed=k; } void setSpeed(int k) ...

  4. linux io 学习笔记(02)---条件变量,管道,信号

    条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t  定 ...

  5. java.lang.NoClassDefFoundError 错误解决思路

    Process: com.oppo.reader, PID: 20472 java.lang.NoClassDefFoundError: com.zhangyue.iReader.PDF2.ui.PD ...

  6. FPGA的嵌入式乘法器

    1. FPGA主要应用在并行处理资源的应用,视频与图像处理,无线通信的中频调制解调器. 嵌入式乘法器可以配置成一个 18 × 18 乘法器,或者配置成两个 9 × 9 乘法器.对于那些大于18 × 1 ...

  7. java 日期格式 毫秒 表示方法

    参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...

  8. Java 图像处理框架-Marvin

    网上看到,摘录过来的,暂时还没涉足这方面的东西 Marvin 1.4.5 的插件接口支持处理多个图像作为输入,新的插件可通过多个图片来确认背景,新的插件可使用多个图片来合并相同场景. Marvin 是 ...

  9. Viewer.js 图片预览插件使用

    一.简介 Viewer.js 是一款强大的图片查看器. Viewer.js 有以下特点: 支持移动设备触摸事件 支持响应式 支持放大/缩小 支持旋转(类似微博的图片旋转) 支持水平/垂直翻转 支持图片 ...

  10. go 语言模拟百度登录

    1.参考网上Python的例子自己写了一个go语言的.这个仅供学习技术参考,为了方便有部分参数直接phantomjs执行js获取,代码基本都有注释,测试打印没有删除,还请见谅! 2.本文参考http: ...