CodeForces - 879C
题解:
这个题当时是真的没搞懂,后来看了大佬的博客思路也还是有些模模糊糊
大佬的博客1
大佬的博客2
化简位运算,输出在5步以内
实际上,由于位运算中的每一位是独立的,因此只需测试两个值:0x0(0b00,0000,0000)和0x3ff(0b11,1111,1111B)。之后比较0和f(0x0)的每一位,以及1和f(0x3ff)的每一位。
记映射f可以分解为若干个位(bit)映射,位i的映射为f[i],则:
若f[i]:0->0,1->0,则f[i]=“&0,|0,^0”,即a[i]=0,b[i]=0,c[i]=0;
若f[i]:0->0,1->1,则f[i]=“&1,|0,^0”,即a[i]=1,b[i]=0,c[i]=0;
若f[i]:0->1,1->0,则f[i]=“&1,|0,^1”,即a[i]=1,b[i]=0,c[i]=1;
若f[i]:0->1,1->1,则f[i]=“&1,|1,^0”,即a[i]=1,b[i]=1,c[i]=0。
于是,对每一位构造a、b、c的对应位即可
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int x=1023,y=0;
for(int i=0;i<n;i++)
{
char s[15];
int d;
cin>>s;
cin>>d;
if(s[0]=='|')
{
x=x|d,y=y|d;
}
else if(s[0]=='&')
{
x=x&d,y=y&d;
}
else x=x^d,y=y^d;
}
int a,b,c;a=-1,b=-1,c=-1;
for(int i=0;i<10;i++)
{
int xx=x&(1<<i);
int yy=y&(1<<i);
if(xx>0&&yy>0)
{
if(a==-1)a=1<<i;
else a+=1<<i;
}
if(xx==0&&yy==0)
{
if(a==-1)a=1<<i;
else a=a|(1<<i);
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
if(xx==0&&yy>0)
{
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
}
int cont=0;
if(a!=-1)cont++;
if(b!=-1)cont++;
if(c!=-1)cont++;
cout<<cont<<endl;
if(a!=-1)
cout<<"| "<<a<<endl;
if(b!=-1)
cout<<"^ "<<b<<endl;
if(c!=-1)
cout<<"& "<<c<<endl;
}
}