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

问了一下大家咋做也没听懂,按兵不动没去看题解,虽然已经晓得复杂度了....最后感觉也不难

用FWT_OR和FWT_AND做一半分别求出超集和和子集和,然后

  • 枚举问号是01,裸的,\(O(2^{cnt[?]})\)
  • 默认问号是1,利用子集和求,\(O(2^{cnt[1]})\)
  • 默认问号是0,利用超集和求,\(O(2^{cnt[0]})\)

可以知道\(min(cnt)\le n/3\),所以复杂度\(O(n2^n 2^{n/3}Q)\)

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; typedef long long ll;
inline int qr(){
int ret=0,f=0,c=getchar();
while(!isdigit(c)) f|=c==45,c=getchar();
while( isdigit(c)) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
}
const int maxn=1<<20|1;
char s[maxn];
int data[maxn],c[maxn],s0[maxn],s1[maxn],n,q;
int cnt[3]; inline void FWT_AND(int*a,const int&len,const int&tag){
for(int t=1;t<len;t<<=1)
for(int i=0;i<len;i+=t<<1)
for(int k=0;k<t;++k)
a[i+k]+=a[t+i+k]*tag;
} inline void FWT_OR(int*a,const int&len,const int&tag){
for(int t=1;t<len;t<<=1)
for(int i=0;i<len;i+=t<<1)
for(int k=0;k<t;++k)
a[t+i+k]+=a[i+k]*tag;
} int num[maxn],u;
int main(){
n=qr(); q=qr();
u=(1<<n)-1;
scanf("%s",s);
for(int t=1;t<1<<n;++t) num[t]=num[t^(t&-t)]+1;
for(int t=0;t<1<<n;++t) data[t]=s[t]-48,s0[t]=data[t],s1[t]=data[t];
FWT_AND(s0,1<<n,1); FWT_OR(s1,1<<n,1);
while(q--){
if(scanf("%s",s)==EOF) return 0;
memset(cnt,0,sizeof cnt);
for(int t=0;t<n;++t){
if(isdigit(s[t])) c[t]=s[t]==49;
else c[t]=2;
++cnt[c[t]];
}
int base=0,wen=0,ans=0,k=min({cnt[0],cnt[1],cnt[2]});
for(int t=0;t<n;++t)
if(c[t]<=1) base=base<<1|c[t],wen<<=1;
else wen=wen<<1|1,base<<=1;
if(cnt[2]==k){
for(int t=wen;~t;--t>=0?t&=wen:t)
ans+=data[t|base];
}else if(cnt[1]==k){
for(int t=base;~t;--t>=0?t&=base:t){
int g=t|wen;
if(num[base^t]&1) ans-=s1[g];
else ans+=s1[g];
}
}else{
base^=u; base^=wen;
for(int t=base;~t;--t>=0?t&=base:t){
int g=t|wen;
if(num[base^t]&1) ans-=s0[g^u];
else ans+=s0[g^u];
}
}
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法
  2. win2008远程桌面会话数增加
  3. 准备写一些读书笔记,最近在填坑 SQL学习指南 Spring in Action effective Java
  4. .net4.0注册到IIS
  5. 开发错误日志之No matching bean of type [xxx] found for dependency
  6. 理解和使用NT驱动程序的执行上下文
  7. WebSocket在ASP.NET MVC4中的简单实现
  8. 在IIS使用localDB
  9. CSAPP 第二章随笔
  10. bower 基础认识
  11. 【sock_stream和sock_dgram】、 【AF_INET和AF_UNIX】
  12. django xadmin后台页面实现二级联动
  13. 日常英语---八、REBOOT - What is the difference? -MapleStory
  14. PHP实现栈数据结构
  15. 通过C/C++基于http下载文件
  16. C# 6.0 的那些事
  17. 前端 HTML 常用标签 head标签相关内容
  18. 001-Two Sum
  19. 移动距离|2015年蓝桥杯B组题解析第八题-fishers
  20. Source Multiplayer Networking【转】

热门文章

  1. Java练习 SDUT-1239_水仙花数
  2. 从零学React Native之06flexbox布局
  3. laravel 5 自定义全局函数,怎么弄呢?
  4. phpstorm2017破解版 2017.3.4 官网中文版
  5. poj 3862 &amp;&amp; LA 4589 Asteroids (三维凸包+多面体重心)
  6. redis 写入数据 越来越慢 是什么原因
  7. 正则表达式中的&quot;\.&quot;表示什么意思
  8. kindeditor编辑器微软雅黑样式font-family值变成&amp;quot;
  9. 深入java面向对象三:抽象类和接口(转载)
  10. tensorflow学习笔记(二十五):ConfigProto&amp;GPU