首先暴力是考虑对每个询问枚举问号填 1 还是 0,然后把每种可能统计到答案中,复杂度是 \(O(2^n \times q)\) 的。

然后我们可以观察出一些性质:

比如 1?1,他可能的情况是 111 或者 101,他们在数值上是不连续的,如果能把他们转化成连续的就好做了。

这里就有一个非常巧妙地转化:

还是以 1?1 为例,我们把它看成一个坐标 \((1,?,1)\),那么可能的情况就是 \((1,1,1)\) 和 \((1,0,1)\)。

画出坐标系,不难发现他们在立方体中是连续的一段。

我们可以把它推广到多维,记 \(sum_{(x_1,x_2,\cdots,x_n)}=\displaystyle \sum_{i_1=0}^{x_1} \sum_{i_2=0}^{x_2} \cdots \sum_{i_n=0}^{x_n} a_{(i_1,i_2,\cdots,i_n)}\)。

这个东西就是一个高维前缀和,可以预处理,我们记录 \(S\) 中 1? 的位置,枚举 1 构成的集合的子集,然后容斥原理计算答案。

同理,我们也可以记录 0 出现的位置,进行容斥计算答案。

因为 10? 的个数至少有一个小于等于 \(\lfloor \dfrac{n}{3} \rfloor\),所以我们统计个数,寻找对应的做法即可。

时间复杂度 \(O(2^{\lfloor \frac{n}{3} \rfloor} \times q)\)。

#include <bits/stdc++.h>
#define reg register
#define fi first
#define se second
#define mp std::make_pair
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int rd()
{
reg int x=0,f=0;
reg char ch=getchar();
while(!isdigit(ch)) (ch=='-')&&(f=1),ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int MAXN=1100000;
int n,q;
int pre[MAXN],suf[MAXN],bit[MAXN],val[MAXN];
char s[MAXN];
void work()
{
n=rd(),q=rd();
scanf("%s",s);
for(reg int i=1;i<=(1<<n)-1;++i) bit[i]=bit[i>>1]+(i&1);
for(reg int i=0;i<=(1<<n)-1;++i) val[i]=pre[i]=suf[i]=s[i]-'0';
for(reg int i=1;i<=(1<<n)-1;i<<=1) for(reg int j=i;j<=(1<<n)-1;j=(j+1)|i)
pre[j]+=pre[j^i],suf[j^i]+=suf[j];
while(q--)
{
scanf("%s",s);
int ans=0,cnt1=0,cnt2=0,cnt3=0,bit1=0,bit2=0,bit3=0;
for(reg int i=0;i<n;++i)
{
if(s[i]=='0') ++cnt1,bit1|=1<<(n-i-1);
if(s[i]=='1') ++cnt2,bit2|=1<<(n-i-1);
if(s[i]=='?') ++cnt3,bit3|=1<<(n-i-1);
}
if(cnt1<=cnt2&&cnt1<=cnt3)
{
int tmp=bit1;
do
{
if(bit[tmp]&1) ans-=suf[tmp|bit2];
else ans+=suf[tmp|bit2];
tmp=(tmp-1)&bit1;
} while(tmp!=bit1);
}
else if(cnt2<=cnt1&&cnt2<=cnt3)
{
int tmp=bit2;
do
{
if(bit[tmp^bit2]&1) ans-=pre[tmp|bit3];
else ans+=pre[tmp|bit3];
tmp=(tmp-1)&bit2;
} while(tmp!=bit2);
}
else
{
int tmp=bit3;
do
{
ans+=val[tmp|bit2];
tmp=(tmp-1)&bit3;
} while(tmp!=bit3);
}
printf("%d\n",ans);
}
}
int main()
{
int _=1;
// _=rd();
while(_--) work();
return 0;
}

[JOI2018] Snake Escaping的更多相关文章

  1. [LeetCode] Design Snake Game 设计贪吃蛇游戏

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  2. Leetcode: Design Snake Game

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

  3. 2101 Problem A Snake Filled

    题目描述 “What a boring world!”Julyed felt so bored that she began to write numbers on the coordinate pa ...

  4. 图像分割之(五)活动轮廓模型之Snake模型简介

    在"图像分割之(一)概述"中咱们简单了解了目前主流的图像分割方法.下面咱们主要学习下基于能量泛函的分割方法.这里学习下Snake模型简单的知识,Level Set(水平集)模型会在 ...

  5. Epic - Snake Sequence

    You are given a grid of numbers. A snakes equence is made up of adjacent numbers such that for each ...

  6. Codeforces Round #290 (Div. 2) A. Fox And Snake 水题

    A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...

  7. 图像切割之(五)活动轮廓模型之Snake模型简单介绍

    图像切割之(五)活动轮廓模型之Snake模型简单介绍 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了 ...

  8. 353. Design Snake Game

    贪食蛇. GAME OVER有2种情况,1是咬到自己,2是出界. 1)用QUEUE来保留占据的格子,每走一格就添加1个,然后POll()最后一个. 做一个一样的SET来check要走的格子是不是已经在 ...

  9. 切割图像(五)主动轮廓模型Snake简要模型

    切割图像(五)主动轮廓模型Snake简要模型 zouxy09@qq.com http://blog.csdn.net/zouxy09 在"图像切割之(一)概述"中咱们简单了解了眼下 ...

  10. [Swift]LeetCode353. 设计贪吃蛇游戏 $ Design Snake Game

    Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...

随机推荐

  1. CF1774C题解

    题目传送门 假设最后一场的环境为 111,即温度大的人赢,那么温度为 111 的人即使活到了最后一场也必输. 同理,如果最后 kkk 场的环境都为 111,那么有 k(1∼k)k(1\sim k)k( ...

  2. 从零开始:基于CUDA 12.6的YOLOv5模型训练实战(RTX 2050显卡全流程)

    基于cuda12.6训练yolov5模型 前面完成了使用CPU调用yolov5s模型进行识别车辆,现在想训练自己的模型进行目标识别,使用CPU效率太低,尝试使用GPU加速的Pytorch,再重新整理了 ...

  3. 同余最短路&转圈背包算法学习笔记(超详细)

    一.问题引入 当你想要解决一个完全背包计数问题,但是 \(M\) 的范围太大,那么你就可以使用同余最短路. 二.算法推导过程 首先对于一个完全背包计数问题,我们要知道如果 \(x\) 这个数能凑出来, ...

  4. idea 调试的时候变量的值变成了jar包显示

    如图所示,暂时不知道怎么处理. 应该是module的问题.我是上了重建module了,代码不是很多.

  5. .net core workflow流程定义

    .net core workflow流程定义 WikeFlow官网:http://www.wikesoft.com WikeFlow学习版演示地址:http://workflow.wikesoft.c ...

  6. SQL 查询强化 - 数据准备

    最近要搞新的项目了, 我的 BI 报表这块, 我感觉, 可能又要写sql, 对于一些简单的 查询, 表连接我还应付得来, 如果涉及多个表的, 什么子查询嵌套, 自定义函数, 加上控制流...就感觉就不 ...

  7. Seata源码—2.seata-samples项目介绍

    大纲 1.seata-samples的配置文件和启动类 2.seata-samples业务服务启动时的核心工作 3.seata-samples库存服务的连接池配置 4.Seata对数据库连接池代理配置 ...

  8. CAP 关键细节点与ACID、BASE的比较

    极客时间:<从 0 开始学架构>:想成为架构师,你必须掌握的CAP细节 1.CAP 关键细节点 埃里克·布鲁尔(Eric Brewer)在<CAP 理论十二年回顾:"规则& ...

  9. CentOS 7.* 安装 python3.8.2 python3.10.2 步骤

    CentOS 7系列 安装 python3.8.2 步骤 1.在python官网下载linux源码包 地址:https://www.python.org/ftp/python/3.8.3/Python ...

  10. PRIMPERM - Prime Permutations

    将题目分解成两个部分: 判断素数 如果用暴力筛因子的方法,在 $t \le 10^4,n \le 10^7$ 下肯定是要超时的,所以用了时间和空间都比较廉价的埃氏筛法. 代码: bool f[1000 ...