ZYF loves binary(binary)

【问题描述】
ZYF 无聊的时候喜欢研究二进制,她认为二进制的世界中只有三种运算:按 位与(and)、按位或(or)和异或(xor)。
有一天她找来了 n个小伙伴并给他们每人一个权值 ai, 然后她发现第 i个人 和第j 个人的友好程度可以表示为ai opt aj,其中 opt是三种运算的一种。 由于 ZYF忙着刷题所以想让你告诉她,对于从左到右的第2 到n 个人,他们 左边与他们友好程度的最大值是多少,还有达到最大值的人数是多少。
【输入格式】
第一行包含一个整数 n,一个串opt 和一个整数type,分别表示人数,运算 类型和数据类型。
第二行包含 n个整数,表示从左往右第 i个人的权值 ai。
【输出格式】
如果 type=0,输出 n-1 行,每行一个整数,其中第i 行输出和第i+1 个人友 好程度的最大值。
如果 type=1,输出 n-1 行,每行两个整数,其中第i 行输出和第i+1 个人友 好程度的最大值和达到最大值的人数。
【样例输入】
5 and 1
3 5 2 7 1
【样例输出】
1 1
2 1
5 1
1 3
【数据规模及约定】
对于 100%的数据,0<=ai<65536,n<=100000

题解:dp

因为ai<65536,所以读入的每一个数都是一个不超过16位的二进制数,所以我们考虑把数分成前八位和后八位。

f[i][j]表示已经出现过的前8位为i的数,与某个后8位为j的数做位运算,后8位的最大值,g[i][j] 表示最大值的方案数。
加入一个数x的时候,设前8位为x,后8位为y,枚举j,用所有j opt y更新所有f[x][j]。
查询一个数x的时候,枚举所有i,用(i opt a)<<8|f[i][b]更新答案
复杂度O(2^8*n)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 1003
using namespace std;
int n,m,opt,g[N][N],f[N][N],a[1000000];
char s[N];
void And()
{for (int i=1;i<=n;i++){int x=a[i]>>8; int y=a[i]%(1<<8);if (i!=1){int maxn=-1; int num=0;for (int j=0;j<=(1<<8)-1;j++){int t=(x&j)<<8|f[j][y];if (t>maxn)  maxn=t,num=g[j][y];else if (t==maxn) num+=g[j][y];}if (opt) printf("%d %d\n",maxn,num);else printf("%d\n",maxn);}for (int j=0;j<=(1<<8)-1;j++){int t=(j&y);if (t>f[x][j])  f[x][j]=t,g[x][j]=1;else if (t==f[x][j]) g[x][j]++;}}
}
void Xor()
{for (int i=1;i<=n;i++){int x=a[i]>>8; int y=a[i]%(1<<8);if (i!=1){int maxn=-1; int num=0;for (int j=0;j<=(1<<8)-1;j++){int t=(x^j)<<8|f[j][y];if (t>maxn)  maxn=t,num=g[j][y];else if (t==maxn) num+=g[j][y];}if (opt) printf("%d %d\n",maxn,num);else printf("%d\n",maxn);}for (int j=0;j<=(1<<8)-1;j++){int t=(j^y);if (t>f[x][j])  f[x][j]=t,g[x][j]=1;else if (t==f[x][j]) g[x][j]++;}}
}
void Or()
{for (int i=1;i<=n;i++){int x=a[i]>>8; int y=a[i]%(1<<8);if (i!=1){int maxn=-1; int num=0;for (int j=0;j<=(1<<8)-1;j++){int t=(x|j)<<8|f[j][y];if (t>maxn)  maxn=t,num=g[j][y];else if (t==maxn) num+=g[j][y];}if (opt) printf("%d %d\n",maxn,num);else printf("%d\n",maxn);}for (int j=0;j<=(1<<8)-1;j++){int t=(j|y);if (t>f[x][j])  f[x][j]=t,g[x][j]=1;else if (t==f[x][j]) g[x][j]++;}}
}
int main()
{freopen("binary.in","r",stdin);freopen("binary.out","w",stdout);scanf("%d%s%d",&n,s,&opt);for (int i=1;i<=n;i++)scanf("%d",&a[i]);memset(f,-1,sizeof(f));memset(g,0,sizeof(g));if (s[0]=='a') And();if (s[0]=='x') Xor();if (s[0]=='o') Or();return 0;
}

ZYF loves binary(dp)相关推荐

  1. DZY Loves Sequences (dp)

    题目链接 题意: 给你一个数组,只能改变数组中一个数,找到最长严格递增子列,输出其区间长度. 思路: 1.dp,对于第i个数,用dp[i][0]保存左边严格递增区间长度(包括i),用dp[i][1]保 ...

  2. HDU 5230 ZCC loves hacking(DP)

    Problem Description Now, a Codefires round is coming to end. ZCC has got C(0≤C≤106) points by solvin ...

  3. ZCC loves cube(cube)

    ZCC loves cube(cube) 题目描述 调戏完了狗,ZCC开始玩起了积木.ZCC的面前有一块n*n的棋盘,他要用这些1*1*1的积木在棋盘上搭出一个宏伟的建筑.积木有三种颜色,ZCC认为一 ...

  4. LeetCode刷题记录4——67. Add Binary(easy)

    LeetCode刷题记录4--67. Add Binary(easy) 目录 LeetCode刷题记录4--67. Add Binary(easy) 题目 语言 思路 后记 题目 今天这题是与字符串相 ...

  5. 求三角形最大面积(DP)

    求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...

  6. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  7. LeetCode 1220. 统计元音字母序列的数目(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...

  8. LeetCode 265. 粉刷房子 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...

  9. LeetCode 256. 粉刷房子(DP)

    文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...

  10. LeetCode 1223. 掷骰子模拟(DP)

    1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...

最新文章

  1. html5 ar开发,HTML5 WebAR开发
  2. 2018年这些UI设计趋势正在流行,跟上必拿高薪!
  3. “ld: symbol(s) not found for architecture i386“错误解决方法
  4. SVN地址正确,能在网页打开,但是检出失败解决方法
  5. 三台主机分别部署LAMP
  6. Windows 95 诞生 25 周年
  7. 【Linux】40.date设定系统时间
  8. for-each 循环原理
  9. 获取图片中感兴趣区域的信息(Matlab实现)
  10. java 工厂模式 计算器_java设计模式之简单工厂模式
  11. TypeError: 'MongoClient' object is not callable
  12. 昆仑通态触摸屏数据转发上传_嵌_ModbusTcpIp数据转发 昆仑通态屏与屏之间通讯 - 下载 - 搜珍网...
  13. 操作系统之进程管理:12、生产者消费者问题和多级生产者多级消费者问题
  14. form怎么加ion_企业微信裂变该怎么做?一份裂变1000+社群裂变方案的底层逻辑
  15. java将所有的字符串转换为大写或小写
  16. 汇编中的inc和dec
  17. JAVA 实现《中国象棋》游戏
  18. java实现开根号:牛顿迭代法
  19. js截取视频第一帧_JS截取视频第一帧
  20. python变量四则运算_python_第一次作业 四则运算

热门文章

  1. FrameTime、FPS、流畅度、Jank
  2. 挂载移动硬盘到ubuntu server
  3. docker配置加速器的几种方案
  4. 单片机学习——看门狗
  5. Monitor(二分,二维前缀和板子记录)
  6. 护照扫描仪的应用环境解读 SDK数据
  7. HDU 6080 度度熊保护村庄(计算几何+floyd)
  8. ArcGIS操作系列(一)之地理配准
  9. java实验检查危险品代码_实验报告题目
  10. 中国汽车系统为Alfa Romeo首款紧凑型SUV电动车开发新型转向系统