求助
查看原帖
求助
57755
Happy_Orca楼主2022/6/27 11:20

这个代码有错,但如果把X限定在29就AK了。 但如果1<<x已经大于m了,那再计算不是没有意义了吗?为什么会对答案产生影响呢?

#include<bits/stdc++.h>
using namespace std;
int n,m,x,ans,v,a[100005];
string s[100005];
inline int read(){
	int ret=0;char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
	return ret;
}
int check(int b,int l){
	for(int i=1;i<=n;i++){
		int k=(a[i]>>l)&1;
		if(s[i]=="AND") b&=k;
		else if(s[i]=="OR") b|=k;
		else b^=k;
	}
	return b;
}
int main(){
//	freopen("x.in","r",stdin);
//	freopen("x.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		char c[5];
		scanf("%s",c);
		s[i]=c;a[i]=read();
	}
	while(m>=(1<<x)) x++;
	for(int i=x;i>=0;i--){
		int res0=check(0,i);
		int res1=check(1,i);
		if(v+(1<<i)<=m&&res1>res0) v+=(1<<i),ans+=res1<<i;
		else ans+=res0<<i;
	}
	printf("%d\n",ans);
	return 0;
}
2022/6/27 11:20
加载中...