https://loj.ac/problem/2351

参考:https://www.cnblogs.com/ivorysi/p/9144676.html

但是参考博客讲解太吓人了,我们换一种通俗易懂的方法讲。

首先肯定是能想到容斥和子集和的,但是很尴尬的是,裸容斥的复杂度是O(2^l)的显然过不去。

我们考虑l特别小,且字符只有三种,话句话讲至少有一个字符个数<=6。

那我们就试图分情况讨论,分成以0,1,?为目标特殊处理。

同时我们:

设数组f[0][i]表示讨论0时i的二进制1集合属于j的二进制1集合时sigma(w[j])

设数组f[1][i]表示讨论0时j的二进制1集合属于i的二进制1集合时sigma(w[j])

这两个数组都能够在O(2^l)求出,接下来利用他们来导出答案。

PS:令x为原数中0集合,y为原数中1集合,z为原数中?集合。eg:原数101?,x=0100,y=1010,z=0001。

?

最简单的情况,暴力枚举即可。

0

枚举x的子集i。

我们求f[0][i|y]的目的就是将?和0空出来,再将0慢慢填上1达到容斥的效果。

(容斥不太好用语言表述还请见谅,请读者自行举例感受容斥。)

显然我们只填1的时候求的是全集,后面我们就要将0填上1来减去我们将0视为1所带来的多于的解(以及加上我们多减的)。

所以当当前的数i有偶数个1时要加,反之减。

1

枚举y的子集i。

我们求f[1][i|z]的目的同理将1和?填上,再将1慢慢填上0达到容斥的效果。

(容斥不太好用语言表述还请见谅,请读者自行举例感受容斥。)

显然我们?和1全填的时候求的是全集,后面我们就要将1填上0来减去我们将1视为0所带来的多于的解(以及加上我们多减的)。

所以当当前的数i比其y相差k个1时,k为偶要加,反之减。

(总之只要有耐心且不像我这么傻就能做出来的啦!~)

#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int L=;
int k,q,f[][L],w[L],calc[L];
char s[L];
int main(){
scanf("%d%d",&k,&q);
cin>>s;
for(int i=;i<(<<k);i++)w[i]=f[][i]=f[][i]=s[i]-'';
for(int i=;i<(<<k);i++)calc[i]=calc[i>>]+(i&);
for(int i=;i<(<<k);i<<=){
for(int j=;j<(<<k);j++){
if(j&i)f[][j]+=f[][j^i],f[][j^i]+=f[][j];
}
}
while(q--){
cin>>s;
int x=,y=,z=,ans=;
for(int i=;i<k;i++){
if(s[i]=='')x|=(<<(k-i-));
else if(s[i]=='')y|=(<<(k-i-));
else z|=(<<(k-i-));
}
if(calc[x]<=){
for(int i=x;;i=(i-)&x){
if(calc[i]&)ans-=f[][i|y];
else ans+=f[][i|y];
if(!i)break;
}
}else if(calc[y]<=){
for(int i=y;;i=(i-)&y){
if(calc[i^y]&)ans-=f[][i|z];
else ans+=f[][i|z];
if(!i)break;
}
}else{
for(int i=z;;i=(i-)&z){
ans+=w[i|y];
if(!i)break;
}
}
printf("%d\n",ans);
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

LOJ2351:[JOI2017/2018决赛]毒蛇越狱——题解的更多相关文章

  1. LOJ2350:[JOI2017/2018决赛]月票购买——题解

    https://loj.ac/problem/2350 比较简单的题,为什么我实现得这么sb? 第一个包其实已经给了提示(第一个包的解法就是在S->T所有最短路径上的所有点到V的最短路的最小值. ...

  2. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  3. 【题解】毒蛇越狱(FWT+容斥)

    [题解]毒蛇越狱(FWT+容斥) 问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难 用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后 枚举问号是 ...

  4. [JOI2017/2018]美術展

    [JOI2017/2018]美術展 题目大意: 有\(n(n\le5\times10^5)\)个物品,每个物品有两个属性:尺寸\(A_i\)和收益\(B_i\).从中选取一个子集,总收益为\(\sum ...

  5. 【LOJ】#2351. 「JOI 2017/2018 决赛」毒蛇越狱

    题解 没啥特别好的算法,是个讨论题,由于0 1 ?三类数位中最少的不会超过6 如果1不超过6,那么记录\(f1(S)\)为 \(\sum_{T \subset S} val(T)\)这个可以通过类似F ...

  6. 2018湘潭邀请赛 AFK题解 其他待补...

    A.HDU6276:Easy h-index Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  7. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  8. [HNOI2008]越狱 题解(容斥原理+快速幂)

    [HNOI2008]越狱 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多 ...

  9. 【LOJ】#2349. 「JOI 2017/2018 决赛」团子制作

    题解 有意思的一个dp,我们对G计数,发现如果不在同一条对角线上的G肯定不会互相影响,所以我们对于每一条对角线dp dp的方式是枚举这个G以什么方式放,横着还是竖着,还是不放 代码 #include ...

随机推荐

  1. CentOS下安装Tomcat环境

    一.安装JAVA环境 1.安装JAVA mkdir -p /usr/local/java 下载jdk1.7.0_67.tar.gz包,并解压到 tar xf jdk1.7.0_67.tar.gz -C ...

  2. 安装MySQLdb模块遭遇"fatal error: my_config.h: No such file or directory"的处理

    Issue       I encountered an error when I run the python script which need to import the module of & ...

  3. 对JSON的理解

    JSON语法: JSON是一种结构化数据,它是一种数据格式 JSON可以概括为三种类型:简单值.对象.数组 注意:JSON不支持变量.函数和对象实例 一.JSON简单值 包括字符串.数值.布尔值.和n ...

  4. Windows运行机理——窗口句柄和消息

    Windows运行机理这系列文章都是来至于<零基础学Qt4编程>——吴迪,个人觉得写得很好,所以进行了搬运和个人加工 现在我们将消息与句柄联系起来.假如有一个窗口,且拥有该窗口的一个句柄( ...

  5. php随机类型验证码

    开发使用验证码的意义就是为了区别操作者是人还是机器,防止自动脚本对服务器造成灾难性的攻击 目前有各种各样的验证码种类,譬如:静态字符验证码.算术验证码.拖拽验证码.识别文字或识别物品验证码(高级),下 ...

  6. Python爬虫使用浏览器的cookies:browsercookie

    很多用Python的人可能都写过网络爬虫,自动化获取网络数据确实是一件令人愉悦的事情,而Python很好的帮助我们达到这种愉悦.然而,爬虫经常要碰到各种登录.验证的阻挠,让人灰心丧气(网站:天天碰到各 ...

  7. CVPR2018 关于视频目标跟踪(Object Tracking)的论文简要分析与总结

    本文转自:https://blog.csdn.net/weixin_40645129/article/details/81173088 CVPR2018已公布关于视频目标跟踪的论文简要分析与总结 一, ...

  8. LeetCode 100——相同的树

    1. 题目 2. 解答 针对两棵树的根节点,有下列四种情况: p 和 q 都为空,两棵树相同: p 不为空 q 为空,两棵树不相同: p 为空 q 不为空,两棵树不相同: p 和 q 都不为空,如果两 ...

  9. HADOOP docker(十):hdfs 结构体系

    1.简介2.namenode和datanode3.The File System Namespace 文件系统命名空间4.Data Replication 数据复制5.Replica Placemen ...

  10. 迭代器类型:iterator & const_iterator

    vector<int> ivec{1, 3, 4, 1, 3, 4}; vector<int>::iterator iter; // iter能读写vector<int& ...