为什么一定要从最高位开始枚举啊?
查看原帖
为什么一定要从最高位开始枚举啊?
57755
Happy_Orca楼主2022/6/27 16:34

我从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 16:34
加载中...