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.
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 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.
3
| 3
^ 2
| 1
2
| 3
^ 2
3
& 1
& 3
& 5
1
& 1
3
^ 1
^ 2
^ 3
0
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.
分析:
实际上我们需要知道的是这些操作的结果,以及如果等效的模拟出这些结果
所以根据题目的范围,我们需要将000000000和111111111进行这些操作,就能将每一位的变化情况了解到
然后对于每一位,通过"&" ”|“ "^",来确定它的变化。
需要注意的是某一位只进行让它变化的操作,其他操作保持原状
比如这一位不需要变化,就&1,|0,^0就能让它保持原状
而如果操作&0,|0,^0, &0进行了将该位变为0的操作,而 |0,^0让它保持原状,也只进行了一种操作,不会发生冲突
对每一位都这样就能达到我们需要的目的
代码如下:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <map> using namespace std; typedef long long ll; int OR[20]; int AND[20]; int XOR[20]; int EXC[20]; int a[20]; int b[20]; char ch[500010]; int r[500010]; int two[20]; int main() { int n,or1=0,and1=0,xor1=0,exc1=0; two[0]=1; for(int i=1;i<=15;i++) two[i]=two[i-1]*2; for(int i=1;i<=10;i++) b[i]=1; scanf("%d",&n); for(int i=1;i<=n;i++) scanf(" %c%d",&ch[i],&r[i]); for(int i=1;i<=n;i++) { for(int j=1;j<=10;j++) { int tmp1=r[i]/two[j-1]; tmp1=tmp1%2; if(ch[i]=='|') a[j]=a[j]|tmp1,b[j]=b[j]|tmp1; else if(ch[i]=='&') a[j]=a[j]&tmp1,b[j]=b[j]&tmp1; else if(ch[i]=='^') a[j]=a[j]^tmp1,b[j]=b[j]^tmp1; } } for(int i=1;i<=10;i++) { AND[i]=1; if(a[i]==1&&b[i]==1) OR[i]=1; else if(a[i]==1&&b[i]==0) XOR[i]=1; else if(a[i]==0&&b[i]==0) AND[i]=0; } for(int i=1;i<=10;i++) { if(OR[i]==1) or1+=two[i-1]; if(AND[i]==1) and1+=two[i-1]; if(XOR[i]==1) xor1+=two[i-1]; } puts("3"); printf("& %d ",and1); printf("| %d ",or1); printf("^ %d ",xor1); return 0; }