• Codeforces Round #443 (Div. 2) C 位运算


    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.

    思路:取x=0,y=1023(即两个互为取反数的数字)。将n次位运算操作后的x,y值,对比即可得到每一位数字进行的 操作。

    代码:

     1 #include<bits/stdc++.h>
     2 #define db double
     3 #include<vector>
     4 #define ll long long
     5 #define vec vector<ll>
     6 #define Mt  vector<vec>
     7 #define ci(x) scanf("%d",&x)
     8 #define cd(x) scanf("%lf",&x)
     9 #define cl(x) scanf("%lld",&x)
    10 #define pi(x) printf("%d
    ",x)
    11 #define pd(x) printf("%f
    ",x)
    12 #define pl(x) printf("%lld
    ",x)
    13 const int N = 1e6 + 5;
    14 const int mod = 1e9 + 7;
    15 const int MOD = mod - 1;
    16 const db  eps = 1e-18;
    17 const db  PI = acos(-1.0);
    18 using namespace std;
    19 bool cal(int a,int i){
    20     if(a&(1<<i)) return 1;
    21     return 0;
    22 }
    23 int main(){
    24     int n;ci(n);
    25     int x=0,y=1023;
    26     while (n--) {
    27         char c[2];
    28         int t;
    29         scanf("%s %d", c, &t);
    30         if (c[0] == '|') x|=t,y|=t;
    31         if (c[0] == '&') x&=t,y&=t;
    32         if (c[0] == '^') x^=t,y^=t;
    33     }
    34     /*
    35      4种:
    36      x:0,y:1.
    37      x y:0011,0010,0111,0110
    38      */
    39     int v1 = 0, v2 = 0, v3 = 0;
    40     for (int i = 0; i < 10; i++) {
    41         if(!cal(x,i)&&cal(y,i))  v2+=(1<<i);//0011: |0 &1 ^0
    42         if(cal(x,i)&&cal(y,i))   v3+=(1<<i);//0111: |0 &0 ^1
    43         if(cal(x,i)&&!cal(y,i))  v2+=(1<<i),v3+=(1<<i);//0110: |0 &1 ^1
    44     }
    45     printf("3
    ");
    46     printf("| %d
    ", v1);
    47     printf("& %d
    ", v2);
    48     printf("^ %d
    ", v3);
    49     return 0;
    50 }
  • 相关阅读:
    7.25
    7.24
    7.23
    7.22
    输入语句/条件运算符
    flowLayoutPanel1设置内容随着鼠标滚动而滚动
    dataGridView读取xml文件
    读文本内容 写入文本内容 创建复制文本
    cmd.ExecuteScalar 和配置连接设置
    $.ajax async同步加载
  • 原文地址:https://www.cnblogs.com/mj-liylho/p/7742711.html
Copyright © 2020-2023  润新知