• 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;
    }
  • 相关阅读:
    C Language Study
    html学习笔记五
    [CS]C#操作word
    bzoj2502 清理雪道
    Android Studio怎样查看资源或者函数在哪些类中被引用
    jvm载入过程
    poj2513(无向图判欧拉路)
    7 天玩转 ASP.NET MVC — 第 2 天
    从头认识java-18.2 主要的线程机制(7)join
    启动MFC程序的时候报错:0xC0000005: 读取位置 0x00000000 时发生访问冲突
  • 原文地址:https://www.cnblogs.com/a249189046/p/7979035.html
Copyright © 2020-2023  润新知