题目大意:
  $n(n\le1000)$个$m(m\le5000)$位的二进制数,第$0$个数为$0$。用$\wedge$和$\vee$将这些数连接起来。$q(q\le1000)$次询问,每次给定一个$m$位二进制数$r$,问有多少种连接方案使得结果为$r$。

思路:
  参考myy的官方题解:

如果第$i$个数之前的运算符是$\wedge$,则这一位设为$1$,否则为$0$,得到的二进制数记为$x$。

对每一位分别考虑,对于第$i$位,如果第$j$个数是$1$,那么这一位设为$1$,否则为$0$,得到的二进制数记为$b_i$。

以左边为最低位,按前缀归纳容易证明,第$i$位的结果为$1$,当且仅当$x<b_i$。

我们将$b$从大到小排序,结果设为$c$,那么答案不为零仅当在$c$的顺序下,$r$中没有任何$0$在$1$的前面。找到$r$中第一个$0$的位置,假设是$k$,那么解$x$要满足$c_k\le x<c_{k-1}$,于是答案是$c_{k-1}-c_k$。

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<climits>
  4. #include<algorithm>
  5. #include<sys/mman.h>
  6. #include<sys/stat.h>
  7. typedef long long int64;
  8. class MMapInput {
  9. private:
  10. char *buf,*p;
  11. int size;
  12. public:
  13. MMapInput() {
  14. register int fd=fileno(stdin);
  15. struct stat sb;
  16. fstat(fd,&sb);
  17. size=sb.st_size;
  18. buf=reinterpret_cast<char*>(mmap(,size,PROT_READ,MAP_PRIVATE,fileno(stdin),));
  19. p=buf;
  20. }
  21. char getchar() {
  22. return (p==buf+size||*p==EOF)?EOF:*p++;
  23. }
  24. };
  25. MMapInput mmi;
  26. inline int getint() {
  27. register char ch;
  28. while(!isdigit(ch=mmi.getchar()));
  29. register int x=ch^'';
  30. while(isdigit(ch=mmi.getchar())) x=(((x<<)+x)<<)+(ch^'');
  31. return x;
  32. }
  33. inline int getdigit() {
  34. register char ch;
  35. while(!isdigit(ch=mmi.getchar()));
  36. return ch^'';
  37. }
  38. const int N=,M=,mod=1e9+;
  39. int pow[M],rank[M],tmp[M],a[M],sum[M];
  40. int main() {
  41. const int n=getint(),m=getint(),q=getint();
  42. for(register int i=;i<m;i++) rank[i]=i;
  43. for(register int i=pow[]=;i<=n;i++) {
  44. pow[i]=pow[i-]*%mod;
  45. }
  46. for(register int i=;i<n;i++) {
  47. int cnt[]={-,m-};
  48. for(register int j=;j<m;j++) {
  49. if(!(a[j]=getdigit())) cnt[]++;
  50. sum[j]=(sum[j]+(int64)a[j]*pow[i])%mod;
  51. }
  52. for(register int j=m-;~j;j--) {
  53. tmp[cnt[a[rank[j]]]--]=rank[j];
  54. }
  55. std::swap(rank,tmp);
  56. }
  57. std::reverse(&rank[],&rank[m]);
  58. for(register int i=;i<q;i++) {
  59. for(register int i=;i<m;i++) a[i]=getdigit();
  60. int last1=INT_MIN,first0=INT_MAX;
  61. for(register int i=m-;~i;i--) {
  62. if(a[rank[i]]) {
  63. last1=i;
  64. break;
  65. }
  66. }
  67. for(register int i=;i<m;i++) {
  68. if(!a[rank[i]]) {
  69. first0=i;
  70. break;
  71. }
  72. }
  73. if(last1>first0) {
  74. puts("");
  75. continue;
  76. }
  77. const int sum1=last1==INT_MIN?pow[n]:sum[rank[last1]];
  78. const int sum2=first0==INT_MAX?:sum[rank[first0]];
  79. printf("%d\n",(sum1-sum2+mod)%mod);
  80. }
  81. return ;
  82. }

[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. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

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

  4. 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)

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

  5. [HNOI 2018]寻宝游戏

    Description 题库链接 给出 \(n\) 个 \(m\) 位的二进制数,在每一个二进制数间插入一个 & 或 | ,第 \(0\) 个数为 \(0\) , \(0,1\) 间也要插入符 ...

  6. 「HNOI/AHOI2018」游戏

    传送门 Luogu 解题思路 这是一道 \(O(n^2)\) 暴力加上 \(\text{random_shuffle}\) 优化 什么鬼 就可以 \(\text{AC}\) 的题. 但还是要讲一下 \ ...

  7. P4424-[HNOI/AHOI2018]寻宝游戏【结论】

    正题 题目链接:https://www.luogu.com.cn/problem/P4424 题目大意 \(n\)个\(m\)位二进制数,开始是一个\(0\). 然后依次对所有二进制数进行\(n\)次 ...

  8. 【题解】Luogu P4436 [HNOI/AHOI2018]游戏

    原题传送门 \(n^2\)过百万在HNOI/AHOI2018中真的成功了qwqwq 先将没门分格的地方连起来,枚举每一个块,看向左向右最多能走多远,最坏复杂度\(O(n^2)\),但出题人竟然没卡(建 ...

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

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

随机推荐

  1. HDU 多校对抗赛第二场 1004 Game

    Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. maven工程开启jetty调试

    转摘自:http://czj4451.iteye.com/blog/1942437 准备工作: a. 在pom.xml中配置jetty插件: <plugins> <plugin> ...

  3. SpringMVC学习 -- 使用 @RequestMapping 映射请求

    在控制器的类定义及方法出定义出都可以标注 @RequestMapping: 类定义处:提供初步的请求映射信息.相对于 Web 应用的根目录. 方法定义出:提供进一步的细分映射信息.相对于类定义处的 U ...

  4. java基础学习(一)hashcode

    hashcode的作用 hashCode()方法是从Object类继承过来的,Object类中的hashCode()方法返回的是对象在内存中地址转换成的int值,如果对象没有重写hashCode()方 ...

  5. SELinux 案例 2

    普通进程权限白名单 sepolicy generate --application [-n NAME] [-u USER ]command [-w WRITE_PATH ]

  6. python 复习 4-1 函数、参数、返回值、递归

    函数 完成特定功能的一个语句组,这个语句组可以作为一个单位使用,并且给它组语句取一个名子,即函数名 可以通过函数名在程序不同地方多次执行,即函数调用 预定义函数(可以直接使用) 自定义函数(自编写的) ...

  7. CSDN博客排名记录

    截止今天,在CSDN的博客排名终于从"千里之外"变成具体的排名数字了.根据CSDN的规则,只有排名在20000以内才能显示具体的排名.从2015年5月11日开始写了第一篇博客.后来 ...

  8. python之多并发socket(zz)

    本文转载自:http://www.cnblogs.com/bainianminguo/p/7337210.html 先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserv ...

  9. 理解Java中【包】的概念

    Java中用package关键字定义一个包,下面通过几个实验,理解Java中的包的概念和作用. 实验1:先看一个无包的情形 在G盘下新建一个Test.java,如图1: 写下面这些代码 <spa ...

  10. nginx [error] open() "/usr/local/nginx/logs/nginx.pid" failed的解决

    今天关闭nginx后重启不了: nginx -s reload 结果报错: nginx: [error] open() "/usr/local/nginx/logs/nginx.pid&qu ...