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.

 分析:

实际上我们需要知道的是这些操作的结果,以及如果等效的模拟出这些结果

所以根据题目的范围,我们需要将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;
}
原文地址:https://www.cnblogs.com/a249189046/p/7979035.html