zoukankan      html  css  js  c++  java
  • Codeforces Round #443 (Div. 1) A. Short Program

    A. Short Program

    http://codeforces.com/contest/878/problem/A

    describe

    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.

    翻译

    现在有一个程序,输入一个[0,1024)的数,然后经过一些位运算之后,输出一个数。

    现在让你简化中间的位运算的过程,使得不超过5步,使得答案和原程序一样。

    题解

    考虑每一位,只会存在4种情况:
    对于输入的数字的每一位而言,要么是1,要么是0。而这些每一位的数输出之后要么变成了0,要么就变成了1.
    (1)0->0,1->0
    (2)0->1,1->0
    (3)0->0,1->1
    (4)0->1,1->1
    对于四种情况,我们都可以通过^和|就可以解决,分情况讨论输出即可。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,a,b,p;
    string s;
    int main(){
        cin>>n;
        a = 0,b = 1023;
        for(int i=0;i<n;i++){
            cin>>s>>p;
            if(s[0]=='|'){
                a|=p;
                b|=p;
            }else if(s[0]=='^'){
                a^=p;
                b^=p;
            }else{
                a&=p;
                b&=p;
            }
        }
        int ans1=0,ans2=0;
        for(int i=0;i<10;i++){
            int a1=a&(1<<i);
            int b1=b&(1<<i);
            if(a1&&b1){
                ans1|=(1<<i);
            }
            if(a1&&!b1){
                ans2|=(1<<i);
            }
            if(!a1&&!b1){
                ans1|=(1<<i);
                ans2|=(1<<i);
            }
        }
        cout<<"2"<<endl;
        cout<<"| "<<ans1<<endl;
        cout<<"^ "<<ans2<<endl;
    }
  • 相关阅读:
    Eclipse中项目去除Js验证
    Web安全扫描工具
    Oracle-定时任务
    About_Return
    About_php_封装函数
    About_PHP_函数
    About_PHP_验证码的生成
    About_PHP_文件的上传
    About_MySQL Select--来自copy_03
    About_AJAX_03
  • 原文地址:https://www.cnblogs.com/qscqesze/p/7756012.html
Copyright © 2011-2022 走看看