zoukankan      html  css  js  c++  java
  • Codeforces Round #879 (Div. 2) C. Short Program

    题目链接:http://codeforces.com/contest/879/problem/C

    C. Short Program

    time limit per test2 seconds
    memory limit per test256 megabytes

    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.
    这里写图片描述

    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.


    别人写的太好了,不敢下手。

    别人家的博客
    之前题意了解错了,就是位运算的等价变换(看不懂的可以试试将位运算替换成加减)。


    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int a,b;
        a = 0,b = 1023;
        int n;
        scanf("%d",&n);
        char s[100];
        int num;
        while(n--)
        {
            scanf("%s%d",s,&num);
            if(s[0] == '|')
            {
                a |= num;
                b |= num;
            }
            else if(s[0] == '&')
            {
                a &= num;
                b &= num;
            }
            else if(s[0] == '^')
            {
                a ^= num;
                b ^= num;
            }
        }
        int num_and = 0,num_or = 0,num_xor = 0;
        num_and = a | b;//0->0,1->1,可以与上b二进制表示中1的部分
        num_or = a & b;//0->1,1->1,两个二进制中都是1的部分
        num_xor = a & (b ^ 1023);//0->1,1->0,两个二进制中都变成1的部分
        printf("3
    ");
        printf("| %d
    ",num_or);
        printf("& %d
    ",num_and);
        printf("^ %d
    ",num_xor);
        return 0;
    }
    
  • 相关阅读:
    python活力练习Day13
    检测一个字符串在另外一个字符串中的位置
    Python活力练习Day12
    Python多进程与单进程效率对比
    HTML-Note
    Python判断自定义的参数格式是否正确
    图片的灰与彩
    Git常用命令
    Linux 单引号和双引号的区别
    类函数中获取进程池对象的地址
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107254.html
Copyright © 2011-2022 走看看