指令 program

【问题描述】

krydom 有一个神奇的机器。

一开始,可以往机器里输入若干条指令: opt x 其中,opt 是 & | ^ 中的一种,0 ≤ x ≤ 1023 。

对于 0 到 1023 的每一个数 m,机器会输出 m 按照指令依次运算后的结果。

现在,krydom 往里面输入了 n 条指令,但是 zcysky 觉得 krydom naive, 只用 3 条指令就实现了和这 n 条指令一样的功能。

由于 krydom 很菜,希望你们帮帮他,但是只需要输出 5 条以内的指令就行了。

【输入格式】

第一行包括一个整数 n,表示指令的个数。 接下来 n 行,每行一个字符 opt 和一个数字 x,表示 ans = ans opt x

【输出格式】

第一行输出一个整数 m,表示有 m 条新指令。(要求 m ≤ 5)

接下来 m 行,每行一个字符 opt 和一个数字 x。表示一条新指令。

【输入输出样例】

Input1 Input2 Input3

3

| 3

^ 2

| 1

3

&1

& 3

& 5

3

^ 1

^ 2

^ 3

Output1 Output2 Output3

2

| 3

^ 2

1

& 1

0

【样例解释】

样例 2 解释:

((x&1)&3)&5 = x&(1&3&5) = x&1

样例 3 解释:

((x^1)^2)^3 = x^(1^3^4) = x^0 = x

【数据范围】

对于 20% 的数据满足: n ≤ 5 。

对于 50% 的数据满足: x ≤ 3 。

对于 100%的数据满足: n ≤ 5*10^5

吐槽

这是道使人有很多想法的题目呢

当我看到位运算是,我想到的是<bitset>……------------STL大法好!

后来,发现不需要那些高级函数和类方法,反倒觉得是搜索

因为我只要从一个数出发,能通过三种运算,得到最终结果即可

DFS

#include<bits/stdc++.h>
using namespace std;
char opt1,opt2[];
int first=;
int num2[],ch=first,flag=;//ch:目标状态
void dfs(int nowch,int depth){//nowch:dfs现在状态
if(depth>) return;//(要求m ≤ 5)
if(flag==) return;
//是否成功
if(ch==nowch) {
cout<<depth<<endl;
for(int i=;i<depth;i++)
cout<<opt2[i]<<" "<<num2[i]<<endl;
flag=;
return;
}
//三种方法
for(int i=;i<=;i++){
num2[depth]=i;
opt2[depth]='&';
dfs(nowch&i,depth+);
opt2[depth]='|';
dfs(nowch|i,depth+);
opt2[depth]='^';
dfs(nowch^i,depth+);
num2[depth]=;
}
return;
}
int main(){
// freopen("program.in","r",stdin);
// freopen("program.out","w",stdout);
int n; cin>>n;
int num1[n],ans=n;
for(int i=;i<n;i++) {
cin>>opt1;
cin>>num1[i];
if(opt1=='&')
ch&=num1[i];
if(opt1=='|')
ch|=num1[i];
if(opt1=='^')
ch^=num1[i];
}
dfs(first,);
return ;
}

后来发现,DFS可以是可以,但是那个first不能仅仅是一个数。

否则,除了一些特殊解,得到的答案可能是错的(非常错!错到离谱!)

因为没有人知道,那台机器到底是按哪个数作为标准的

何况,它会把1到1023(1111111111)全输出

按道理说吧,那基础的几十分总是能拿到的吧?

但是,dfs最大的敌人,就是还没搜到就超时了。。。

于是,我们就惊讶的看到了std。。。

std

 #include <cstdio>
#define FOR(i, l, r) for(int i = l; i <= r; ++i)
using namespace std;
int n, x, y, opt, f[];
char s[];
//用来表示 and& or| xor^
int work(int now, int opt)
{
if (opt == ) return ;//如果是&,返回0
if (opt == ) return ;//如果是|,返回1
if (now <= ) return now ^ ;//如果now小于等于1,返回now对1按位异或
else return - now;//now大于1,返回0101-now
}
int output(int x)
{
int ans = ;//每次输出结果先归0
for(int i = ; i; --i)
{
ans <<= ;//每次把ans左移一位,差不多相当于是自乘2 (0左移一位(或者说是*2)还是0哟)
if (f[i] == x) ans |= ;//如果f[10~1]等于x(输进来的数),就把ans按位或于1,即把最低位变成1
}
return ans;
}
int main()
{
// freopen("program.in", "r", stdin);
// freopen("program.out", "w", stdout); FOR(i, , ) f[i] = ;
scanf("%d", &n);
FOR(i, , n)
{
scanf("%s%d", s, &x);//输入
if (s[] == '&') opt = ; else//分别用1,2,3来存储& | ^
if (s[] == '|') opt = ; else opt = ;
FOR(j, , )
{
y = x & ;//把x与1按位与的值赋给y
if (opt == && !y) f[j] = work(f[j], );
if (opt != && y) f[j] = work(f[j], opt);
x >>= ;
}
}
puts("");//固定输出3,方便与三个符号都有操作
printf("& %d\n", output() ^ );//把结果与1111111111取按位异或
printf("| %d\n", output());
printf("^ %d\n", output());
//其实只要m<=5就好了,但是这是最简单的方法
return ;
}

std的解析都在注释里了。

因为这道题是SPJ,所以就算输出后面跟着的是0也行,不输出也行。

这种方法也告诉我们,多种位运算是可以用三种位运算表示滴~

有木有感觉很神奇?

嵊州D5T3 指令 program 神奇的位运算的更多相关文章

  1. Java中的二进制及基本的位运算

    Java中的二进制及基本的位运算 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二 ...

  2. zoj--3870--Team Formation(位运算好题)

    Team Formation Time Limit: 3000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  3. N皇后的位运算有感

    N皇后很明显是一个NP-Hard问题,如果n足够大的话,在有限较短的时间内是很难得出答案的,但是注意到N皇后(笔者认为这类问题称为棋盘问题更为贴切),在n*n棋盘之上,每个点有且只有两种状态,这与电脑 ...

  4. 【Assembly】-NO.88.Assembly.2.滴水逆向.1.002-【位运算及基础指令】-

    1.0.0 Summary Tittle:[Assembly]-NO.88.Assembly.2.滴水逆向.1.002-[]- Style:Java Series:Log4j Since:2018-0 ...

  5. 神奇的Noip模拟试题 T3 科技节 位运算

    3 科技节 (scifest.pas/.c/.cpp) [问题描述] 一年一度的科技节即将到来.同学们报名各项活动的名单交到了方克顺校长那,结果校长一看皱了眉头:这帮学生热情竟然如此高涨,每个人都报那 ...

  6. Codeforces Round #443 (Div. 2) C: Short Program - 位运算

    传送门 题目大意: 输入给出一串位运算,输出一个步数小于等于5的方案,正确即可,不唯一. 题目分析: 英文题的理解真的是各种误差,从头到尾都以为解是唯一的. 根据位运算的性质可以知道: 一连串的位运算 ...

  7. 我眼中的 Nginx(一):Nginx 和位运算

    作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...

  8. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  9. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

随机推荐

  1. BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)

    题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...

  2. Ops: 高效组合命令集合

    简介 本篇博客收集一些常用的复杂命令组合,这些命令组合能够高效的定位.分析.处理一些问题,希望对需要的小伙伴有所帮助. 命令集合 批量备份文件 将名称为config.xml的文件查找出来,并在原目录备 ...

  3. 低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读

    什么是蓝牙service和characteristic?到底怎么理解蓝牙profile?ATT和GATT两者如何区分?什么又是attribute?attribute和characteristic的区别 ...

  4. onboard procossor and cross-compile

    星载处理器 ERC32-TSC695F The European Space Agency’s ERC32 is a microprocessor implementing a SPARC V7 pr ...

  5. JS设计模式——策略模式

    设计模式高大上,业务代码用不上...平时用不上我们就可以忽略了吗? 非也,就像面试造火箭,工作拧螺丝一样.万一我们公司哪天要造火箭了,你得立马能上手. 同时,有些复杂的业务代码也可以用设计模式的思想去 ...

  6. .NET Core之单元测试(四):Fluent Assertions的使用

    目录 什么是Fluent Assertions 待测试API 测试用例 什么是Fluent Assertions Fluent Assertions 是 .NET 平台下的一组扩展方法,用于单元测试中 ...

  7. AVR单片机教程——示波器

    本文隶属于AVR单片机教程系列.   在用DAC做了一个稍大的项目之后,我们来拿ADC开开刀.在本讲中,我们将了解0.96寸OLED屏,移植著名的U8g2库到我们的开发板上,学习在屏幕上画直线的算法, ...

  8. C# ,数据导出到带有级联下拉框的模板(一,模板的级联功能)

    一.首先解决如何做模板中增加级联功能 1,首先打开一个新的Excel文件,新增sheet,把分类保存在里面,如下图所示 2.回到sheet1,选中要增加下拉框的行(注意:请排除首行,首行是标题) 3. ...

  9. 07.JS对象-2

    前言: 学习一门编程语言的基本步骤(01)了解背景知识(02)搭建开发环境(03)语法规范(04)常量和变量(05)数据类型(06)数据类型转换(07)运算符(08)逻辑结构(09)函数(10)对象1 ...

  10. 网页延迟加载动画的实现-WOW.js

    网页内容一开始不显示,随着鼠标下拉延迟显示,还有时间差 一开始觉得好难好复杂好高大上,直到我发现 wow.js …… 首先是演示地址:https://www.delac.io/wow/ 嗯,狗子确实很 ...