Codeforces 879C Short Program【思维】
2017-10-27 13:06
393 查看
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
output
input
output
input
output
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.
题目大意:
化简位运算,输出在5步以内。
思路:
①我们初始设定x为1023,y为0,然后将两个数按照操作过程得到结果。
②然后我们对于每一位进行讨论,如果最终结果上:
1.x和y这一位都是1,那么相当于在这一位上,或上 1、
2.x和y这一位都是0,那么相当于在这一位上,或一个1然后亦或一个1、
3.x是1y是0,那么相当于不动。
4.x是0y是1,那么相当于在这一位上,亦或一个1.
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int x=1023,y=0;
for(int i=0;i<n;i++)
{
char s[15];
int d;
scanf("%s%d",s,&d);
if(s[0]=='|')
{
x=x|d,y=y|d;
}
else if(s[0]=='&')
{
x=x&d,y=y&d;
}
else x=x^d,y=y^d;
}
int a,b,c;a=-1,b=-1,c=-1;
for(int i=0;i<10;i++)
{
int xx=x&(1<<i);
int yy=y&(1<<i);
if(xx>0&&yy>0)
{
if(a==-1)a=1<<i;
else a+=1<<i;
}
if(xx==0&&yy==0)
{
if(a==-1)a=1<<i;
else a=a|(1<<i);
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
if(xx==0&&yy>0)
{
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
}
int cont=0;
if(a!=-1)cont++;
if(b!=-1)cont++;
if(c!=-1)cont++;
printf("%d\n",cont);
if(a!=-1)printf("| %d\n",a);
if(b!=-1)printf("^ %d\n",b);
if(c!=-1)printf("& %d\n",c);
}
}
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.
题目大意:
化简位运算,输出在5步以内。
思路:
①我们初始设定x为1023,y为0,然后将两个数按照操作过程得到结果。
②然后我们对于每一位进行讨论,如果最终结果上:
1.x和y这一位都是1,那么相当于在这一位上,或上 1、
2.x和y这一位都是0,那么相当于在这一位上,或一个1然后亦或一个1、
3.x是1y是0,那么相当于不动。
4.x是0y是1,那么相当于在这一位上,亦或一个1.
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int x=1023,y=0;
for(int i=0;i<n;i++)
{
char s[15];
int d;
scanf("%s%d",s,&d);
if(s[0]=='|')
{
x=x|d,y=y|d;
}
else if(s[0]=='&')
{
x=x&d,y=y&d;
}
else x=x^d,y=y^d;
}
int a,b,c;a=-1,b=-1,c=-1;
for(int i=0;i<10;i++)
{
int xx=x&(1<<i);
int yy=y&(1<<i);
if(xx>0&&yy>0)
{
if(a==-1)a=1<<i;
else a+=1<<i;
}
if(xx==0&&yy==0)
{
if(a==-1)a=1<<i;
else a=a|(1<<i);
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
if(xx==0&&yy>0)
{
if(b==-1)b=1<<i;
else b=b|(1<<i);
}
}
int cont=0;
if(a!=-1)cont++;
if(b!=-1)cont++;
if(c!=-1)cont++;
printf("%d\n",cont);
if(a!=-1)printf("| %d\n",a);
if(b!=-1)printf("^ %d\n",b);
if(c!=-1)printf("& %d\n",c);
}
}
相关文章推荐
- Codeforces 746C Tram 模拟+思维
- Codeforces 322C Ciel and Robot【思维+模拟】细节很多= =
- Codeforces 149D Coloring Brackets【区间Dp+思维】好题!好题!
- Codeforces 230D Planets【思维+SPFA】
- Codeforces-298A 思维训练
- 【CodeForces】703C - Chris and Road(思维,好题)
- CodeForces 567C Geometric Progression【思维+map】
- Codeforces - 466C. Number of Ways - 思维、暴力
- Codeforces 757C Felicity is Coming!【思维+vector应用】STL好神奇啊!
- Codeforces 822 C. Hacker, pack your bags! 思维
- Codeforces 371D Vessels【思维+并查集】经典套路题
- Codeforces 828 D. High Load 思维+构造
- codeforces-546D-Soldier and Number Game【思维】(求质因子个数)
- Codeforces 604C - Alternative Thinking(思维)
- Codeforces 621B - Wet Shark and Bishops(思维)
- codeforces 599 C. Day at the Beach【思维】
- codeforces-707【思维】【图论】【勾股数】
- Codeforces 421D Bug in Code(思维)
- 【CodeForces - 879】 A B C【构造+思维】
- 【Codeforces-402A】-Pupils Redistribution(思维)