原题链接:
题意:给出n个位运算操作, 化简这些操作, 使化简后的操作次数不多于5步。
思路:我们可以对二进制每一位上的1, 0, 进行讨论,
如果n次操作后1 -->1, 0 --> 1, 说明这一位要用或操作(or 1)
类似的,1 -->0, 0 -->1, 说明这一位要用异或操作(xor 1)
1 -->0, 0 -->0, 说明这一位要用与操作(and 0)
1 -->1, 0 -->0,前后不变,可以不用进行操作。
其中,and 0 操作可以用 or 1 xor 1代替, 那么最后化简后的操作次数不会超过 2 次。
AC代码:
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 typedef long long LL; 9 int XOR, OR;10 int p[11];11 int b1,b2;12 char ch[500005];13 int num[500005][11];14 int cal(int b, int j, int i){15 if(ch[j]=='|') return b|num[j][i];16 if(ch[j]=='&') return b&num[j][i];17 else return b^num[j][i];18 }19 int main()20 {21 int n,m;22 p[0]=1;23 for(int i=1;i<11;i++) p[i]=p[i-1]*2;24 while(cin>>n)25 {26 XOR=OR=0;27 memset(num, 0, sizeof(num));28 for(int i=0;i >=1;35 }36 }37 for(int i=0;i<10;i++){38 b1=1,b2=0;39 for(int j=0;j