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\n");
printf("| %d\n",num_or);
printf("& %d\n",num_and);
printf("^ %d\n",num_xor);
return 0;
}
最新文章
- JavaScript 基础回顾——函数
- 将公司的主要项目从eclipse迁移到android studio for mac环境(1)
- JavaScript里面三个等号和两个等号有什么区别?
- 1 。 LightOJ 1234 打表法(数据太大,把数据缩小100倍)
- python 基础干货 01
- Haffman编码(haffman树)
- 剑指offer 二叉搜索树与双向链表
- StringBuffer与StringBuilder
- istio-opentracing链路追踪方案
- BUG在线上环境中出现的原因总结
- npm设置和查看仓库源
- [转]php,使用Slim和Medoo搭建简单restful服务
- GIS开发之数据查询
- .net core实践系列之SSO-同域实现
- 【LeetCode每天一题】Valid Parentheses(有效的括弧)
- MongDB篇,第四章:数据库知识4
- JFinal Web开发学习(四)数据库连接与自动生成model
- python 发送邮件 带附件
- Unknown column in &#39;field list&#39;
- te
热门文章
- SqlServer存储过程调用接口
- Less的学习和使用
- AJPFX关于collection总结
- ES-windos环境搭建(2)
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
- jmeter中文件上传配置
- iOS上架问题解决
- Java面试题全集(下)
- Failed to configure a DataSource: &#39;url&#39; attribute is not specified and no embedded datasource could be configured.Reason: Failed to determine a suitable driver class
- 解决response在controller返回乱码的解决方式