[Codeforces Round #443]Div2 C Short Program

给你一串$n$个按顺序的位运算操作(&,|,^),形如"opt x",要求用不超过5行的位运算,按顺序操作出来和那个结果是一样的。$(n<=5e5,0<=x<1024)$


 

会了之后很水。构造。。

首先确定每一位是原来是$1$会变成啥,是$0$会变成啥。

然后用位运算构造。我太菜md居然不会......

具体如下

假设最后要或$a$,与$b$,异或$c$。初值$a=0,b=1023,c=0$。如果啥也不改输入啥还是输出啥。

$0\rightarrow1,1\rightarrow0$  取反,这位要异或,$a$的这位赋为$1$。

$0\rightarrow0,1\rightarrow0$  清零,这位要与上$0$,$b$的这位赋为$0$。

$0\rightarrow1,1\rightarrow1$  需要填上$1$,这位要或,$c$的这位赋为$1$。

 


 

#include<bits/stdc++.h>
using namespace std;
int a,b,c,x,y;
int main(){
    int n;cin>>n;x=b=1023;
    for(int i=1;i<=n;i++){
        char ch[10];scanf("%s",ch);
        int t;cin>>t;
        if(ch[0]=='|')x|=t,y|=t;
        if(ch[0]=='&')x&=t,y&=t;
        if(ch[0]=='^')x^=t,y^=t;
    }
    for(int i=0;i<10;i++){
        int f=1<<i;
        int p=x&f,q=y&f;
        if(p&&q)a+=f;
        if(!p&&!q)b-=f;
        if((!p)&&q)c+=f;
    }
    cout<<"3\n";
    cout<<"| "<<a<<endl;
    cout<<"& "<<b<<endl;
    cout<<"^ "<<c<<endl;
}

 

当时瓜田里没人想出来,,即使是看了yyc大佬的简要题解,,嗷嗷嗷还是太菜了。。

posted @ 2017-10-27 15:37  orzzz  阅读(270)  评论(0编辑  收藏  举报