Codeforces Round #443 (Div. 2) C 位运算

C. Short Program
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Petya learned a new programming language CALPAS. A program in this language always takes one non-negative integer and returns one non-negative integer as well.

In the language, there are only three commands: apply a bitwise operation AND, OR or XOR with a given constant to the current integer. A program can contain an arbitrary sequence of these operations with arbitrary constants from 0 to 1023. When the program is run, all operations are applied (in the given order) to the argument and in the end the result integer is returned.

Petya wrote a program in this language, but it turned out to be too long. Write a program in CALPAS that does the same thing as the Petya's program, and consists of no more than 5 lines. Your program should return the same integer as Petya's program for all arguments from 0 to 1023.

Input

The first line contains an integer n (1 ≤ n ≤ 5·105) — the number of lines.

Next n lines contain commands. A command consists of a character that represents the operation ("&", "|" or "^" for AND, OR or XOR respectively), and the constant xi 0 ≤ xi ≤ 1023.

Output

Output an integer k (0 ≤ k ≤ 5) — the length of your program.

Next k lines must contain commands in the same format as in the input.

Examples
input
3
| 3
^ 2
| 1
output
2
| 3
^ 2
input
3
& 1
& 3
& 5
output
1
& 1
input
3
^ 1
^ 2
^ 3
output
0
Note

You can read about bitwise operations in https://en.wikipedia.org/wiki/Bitwise_operation.

Second sample:

Let x be an input of the Petya's program. It's output is ((x&1)&3)&5 = x&(1&3&5) = x&1. So these two programs always give the same outputs.

思路:取x=0,y=1023(即两个互为取反数的数字)。将n次位运算操作后的x,y值,对比即可得到每一位数字进行的 操作。

代码:

 1 #include<bits/stdc++.h>
 2 #define db double
 3 #include<vector>
 4 #define ll long long
 5 #define vec vector<ll>
 6 #define Mt  vector<vec>
 7 #define ci(x) scanf("%d",&x)
 8 #define cd(x) scanf("%lf",&x)
 9 #define cl(x) scanf("%lld",&x)
10 #define pi(x) printf("%d
",x)
11 #define pd(x) printf("%f
",x)
12 #define pl(x) printf("%lld
",x)
13 const int N = 1e6 + 5;
14 const int mod = 1e9 + 7;
15 const int MOD = mod - 1;
16 const db  eps = 1e-18;
17 const db  PI = acos(-1.0);
18 using namespace std;
19 bool cal(int a,int i){
20     if(a&(1<<i)) return 1;
21     return 0;
22 }
23 int main(){
24     int n;ci(n);
25     int x=0,y=1023;
26     while (n--) {
27         char c[2];
28         int t;
29         scanf("%s %d", c, &t);
30         if (c[0] == '|') x|=t,y|=t;
31         if (c[0] == '&') x&=t,y&=t;
32         if (c[0] == '^') x^=t,y^=t;
33     }
34     /*
35      4种:
36      x:0,y:1.
37      x y:0011,0010,0111,0110
38      */
39     int v1 = 0, v2 = 0, v3 = 0;
40     for (int i = 0; i < 10; i++) {
41         if(!cal(x,i)&&cal(y,i))  v2+=(1<<i);//0011: |0 &1 ^0
42         if(cal(x,i)&&cal(y,i))   v3+=(1<<i);//0111: |0 &0 ^1
43         if(cal(x,i)&&!cal(y,i))  v2+=(1<<i),v3+=(1<<i);//0110: |0 &1 ^1
44     }
45     printf("3
");
46     printf("| %d
", v1);
47     printf("& %d
", v2);
48     printf("^ %d
", v3);
49     return 0;
50 }
原文地址:https://www.cnblogs.com/mj-liylho/p/7742711.html