您的位置:首页 > 其它

Codeforces 879C Short Program【思维】

2017-10-27 13:06 393 查看
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.

题目大意:

化简位运算,输出在5步以内。

思路:

①我们初始设定x为1023,y为0,然后将两个数按照操作过程得到结果。

②然后我们对于每一位进行讨论,如果最终结果上:

1.x和y这一位都是1,那么相当于在这一位上,或上 1、

2.x和y这一位都是0,那么相当于在这一位上,或一个1然后亦或一个1、

3.x是1y是0,那么相当于不动。

4.x是0y是1,那么相当于在这一位上,亦或一个1.

Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int x=1023,y=0;
for(int i=0;i<n;i++)
{
char s[15];
int d;
scanf("%s%d",s,&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++;
printf("%d\n",cont);
if(a!=-1)printf("| %d\n",a);
if(b!=-1)printf("^ %d\n",b);
if(c!=-1)printf("& %d\n",c);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Codeforces 879C