Codeforces Round #443 (Div. 2) C. Short Program

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行的程序使得运算结果和给出程序的运算结果相同

 思路:经过如果操作之后,总共十位二进制数,有:确定为1的,确定为0的,不变的,是原来的相反的,然后分别讨论四种
     情况
 */
#include <bits/stdc++.h>

#define MAXN 500005
#define MAXK 2

using namespace std;

int n;
char str[MAXN][MAXK];
int a[MAXN];
int ora,xora,anda;

inline int cal(int x){
    for(int i=0;i<n;i++){
        switch(str[i][0]){
            case '^':
                x^=a[i];
                break;
            case '&':
                x&=a[i];
                break;
            case '|':
                x|=a[i];
                break;
        }

    }
    return x;
}

inline void init(){
    ora=0;
    xora=0;
    anda=0;
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s%d",str[i],&a[i]);
    }    
    int pos=cal(0);
    for(int i=0;i<10;i++){
        int cur=cal((1<<i));
        if(( cur&(1<<i) )==0&&( pos&(1<<i) )==0){//如果这一位肯定为0
            
        }else if(( cur&(1<<i) )!=0&&( pos&(1<<i) )!=0){//这位肯定为1
            anda+=(1<<i);
            ora+=(1<<i);
        }else if(( cur&(1<<i) )==0&&( pos&(1<<i) )!=0){//这位和原来相反
            anda+=(1<<i);
            xora+=(1<<i);
        }else{//这位不变
            anda+=(1<<i);
        }    
    }
    printf("3
");
    printf("& %d
",anda);
    printf("| %d
",ora);
    printf("^ %d
",xora);
    return 0;
}
原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/7744245.html