LOJ #2351. 「JOI 2018 Final」毒蛇越狱
奇妙的看上去不能过的题目。
首先有一个非常sb的暴力,大概就是枚举?
的子集,然后统计,时间复杂度单次。
直接算没有优化空间,考虑子集容斥,先FWT预处理出表示的子集的和,然后枚举当前串的子集算答案。时间复杂度。平衡后复杂度。
还是不能过,再考虑超集容斥,预处理表示的超集的和,然后枚举当前串的算答案。时间复杂度,平衡后复杂度。
code:
#include<bits/stdc++.h>
#define Gc() getchar()
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n))
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=20+5,M=(1<<20)+5,K=1e5+5,mod=1e9+7,Mod=mod-1,INF=2e9+7;const db eps=1e-5;
int n,m,k,C1,C2,C3,x,y,z,f[M],g[M],H[M],Ans;char s[N],c[M];
int main(){
freopen("1.in","r",stdin);
int i,j,h;scanf("%d%d",&n,&m);k=(1<<n);scanf("%s",c);for(i=0;i<k;i++) g[i]=f[i]=c[i]-='0';
for(i=2;i<=k;i<<=1) for(j=0;j<k;j+=i) for(h=j;h<j+i/2;h++) f[h]+=f[h+i/2],g[h+i/2]+=g[h];H[0]=1;for(i=1;i<k;i++) H[i]=H[i>>1]*(i&1?-1:1);
while(m--){Ans=x=y=0;scanf("%s",s);C1=C2=C3=0;for(i=0;i<n;i++) C1+=(s[i]=='0'),C2+=(s[i]=='1'),C2+=(s[i]=='?');
if(C2<=7){
for(i=0;i<n;i++) s[i]=='1'&&(x|=(1<<n-i-1)),s[i]=='?'&&(y|=(1<<n-i-1));
Ans=c[x];for(i=y;i;i=(i-1)&y) Ans+=c[x|i];
}else if(C1<=7){
for(i=0;i<n;i++) s[i]=='0'&&(x|=(1<<n-i-1)),s[i]=='1'&&(y|=(1<<n-i-1));
Ans=H[0]*f[y];for(j=x;j;j=(j-1)&x) Ans+=H[j]*f[j|y];
}else {
for(i=0;i<n;i++) s[i]=='?'&&(x|=(1<<n-i-1)),s[i]=='1'&&(y|=(1<<n-i-1));
Ans=H[0]*g[x];for(j=y;j;j=(j-1)&y) Ans+=H[j]*g[j|x];Ans=abs(Ans);
}
printf("%d\n",Ans);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧