[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大佬的简要题解,,嗷嗷嗷还是太菜了。。