题目链接: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;
}

最新文章

  1. JavaScript 基础回顾——函数
  2. 将公司的主要项目从eclipse迁移到android studio for mac环境(1)
  3. JavaScript里面三个等号和两个等号有什么区别?
  4. 1 。 LightOJ 1234 打表法(数据太大,把数据缩小100倍)
  5. python 基础干货 01
  6. Haffman编码(haffman树)
  7. 剑指offer 二叉搜索树与双向链表
  8. StringBuffer与StringBuilder
  9. istio-opentracing链路追踪方案
  10. BUG在线上环境中出现的原因总结
  11. npm设置和查看仓库源
  12. [转]php,使用Slim和Medoo搭建简单restful服务
  13. GIS开发之数据查询
  14. .net core实践系列之SSO-同域实现
  15. 【LeetCode每天一题】Valid Parentheses(有效的括弧)
  16. MongDB篇,第四章:数据库知识4
  17. JFinal Web开发学习(四)数据库连接与自动生成model
  18. python 发送邮件 带附件
  19. Unknown column in &#39;field list&#39;
  20. te

热门文章

  1. SqlServer存储过程调用接口
  2. Less的学习和使用
  3. AJPFX关于collection总结
  4. ES-windos环境搭建(2)
  5. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
  6. jmeter中文件上传配置
  7. iOS上架问题解决
  8. Java面试题全集(下)
  9. 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
  10. 解决response在controller返回乱码的解决方式