Codeforces Problem 778B Bitwise Formula
题目链接:http://codeforces.com/contest/779/problem/E
题意:有n个变量都可以用m位二进制数表示,这n个数的value将以两种格式中的一种给出
1.变量名, 空格, ":=", 空格, 一个正好m位的二进制数
eg(m = 3): a := 101
2.变量名, 空格, ":=", 空格, 第一个变量, 空格, 位运算符(AND,OR,XOR), 空格, 第二个变量
每一个变量都是前面被定义过的变量或者用 '?'表示
eg: aaa := a AND aa
bbb := b XOR ?
你需要确定'?'这个m位的二进制数,并输出使n个数总和最小和最大时的'?'
maxn = 5000
maxm = 1000
解法:一个稍复杂的二进制模拟题
'?'这个二进制数的m位每一位都有2种可能
所以与'?'有关的所有变量的二进制表示中每一位最多都有2种可能
注意到第二种读入中可能某个变量的值与'?'有关,后面这个变量又会参与运算
所以我们当计算第 i 个数时,需要保证前i - 1个数都已经被计算出来
所以解题思路就是直接计算出所有变量
然而如果读入一个算式立即用if各种判断的话,写出来会很丑很长
我们需要考虑简化代码 (参考了rank2的代码
注意到我们如果循环读入一个变量立刻计算其value需要O(nm)的空间
转化为全部读入后再一位一位的处理只需要O(n)的空间
我们可以v1和v2表示参与运算的变量的标号('?'被表示为第n+1个变量)
并用op来记录是哪种位运算符,最后统一处理就方便了很多
(string+map大法好
#include <bits/stdc++.h>
using namespace std;
map <string, int> p;
int n, m, c[];
int s[][];
struct node {
int op;
int v1, v2;
string s;
}a[];
int main() {
string s1, s2, s3, s4, s5, ansmin = "", ansmax = "";
scanf("%d %d", &n, &m);
for(int i = ;i <= n;i ++) {
cin >> s1 >> s2 >> a[i].s, p[s1] = i;
if(a[i].s[] == '' || a[i].s[] == '') continue;
if(a[i].s[] == '?') a[i].v1 = n + ;
else a[i].v1 = p[a[i].s];
cin >> s4 >> s5;
switch(s4[]) {
case 'A':a[i].op = ;break;
case 'O':a[i].op = ;break;
case 'X':a[i].op = ;break;
}
if(s5[] == '?') a[i].v2 = n + ;
else a[i].v2 = p[s5];
}
s[][n + ] = , s[][n + ] = ;
for(int i = ;i < m;i ++) {
c[] = , c[] = ;
for(int k = ;k < ;k ++) {
for(int j = ;j <= n;j ++) {
switch(a[j].op) {
case :s[k][j] = a[j].s[i] - '';break;
case :s[k][j] = s[k][a[j].v1] & s[k][a[j].v2];break;
case :s[k][j] = s[k][a[j].v1] | s[k][a[j].v2];break;
case :s[k][j] = s[k][a[j].v1] ^ s[k][a[j].v2];break;
}
if(s[k][j]) c[k] ++;
}
}
ansmin += c[] <= c[] ? '' : '';
ansmax += c[] >= c[] ? '' : '';
}
cout << ansmin << '\n' << ansmax;
return ;
}
Codeforces Problem 778B Bitwise Formula的更多相关文章
- CodeForces 778B - Bitwise Formula
题意: 选择一个 m 位的二进制数字,总分为 n 个算式的答案之和.问得到最低分和最高分分别应该取哪个二进制数字 分析: 因为所有数字都是m位的,高位的权重大于低位 ,我们就从高到低考虑 ans 的每 ...
- 【codeforces 779E】Bitwise Formula
[题目链接]:http://codeforces.com/contest/779/problem/E [题意] 给你n个长度为m的二进制数 (有一些是通过位运算操作两个数的形式给出); 然后有一个未知 ...
- Codeforces Gym 100610 Problem E. Explicit Formula 水题
Problem E. Explicit Formula Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- CodeForces 779E Bitwise Formula
位运算,枚举. 按按分开计算,枚举$?$是$0$还是$1$,分别计算出$sum$,然后就可以知道该位需要填$1$还是$0$了. #include<map> #include<set& ...
- 【推导】【贪心】Codeforces Round #402 (Div. 2) E. Bitwise Formula
按位考虑,每个变量最终的赋值要么是必为0,要么必为1,要么和所选定的数相同,记为2,要么和所选定的数相反,记为3,一共就这四种情况. 可以预处理出来一个真值表,然后从前往后推导出每个变量的赋值. 然后 ...
- Codeforces Problem 708A Letters Cyclic Shift
题目链接: http://codeforces.com/problemset/problem/708/A 题目大意: 从字符串s中挑选出一个子串(非空),将该子串中的每个字母均替换成前一个字母,如' ...
- CF778B(round 402 div.2 E) Bitwise Formula
题意: Bob recently read about bitwise operations used in computers: AND, OR and XOR. He have studied t ...
- codeforces problem 140E New Year Garland
排列组合题 题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 只 ...
- Codeforces Problem 598E - Chocolate Bar
Chocolate Bar 题意: 有一个n*m(1<= n,m<=30)的矩形巧克力,每次能横向或者是纵向切,且每次切的花费为所切边长的平方,问你最后得到k个单位巧克力( k <= ...
随机推荐
- dotnet core 文档链接
The installation was successful The following were installed at C:\Program Files\dotnet • .NET Core ...
- linux下.a/.so/.la目标库区别
在linux平台上编译时,常会遇到目标库的疑问,有静态库也有动态库,单个理解都不太难,但是对复杂的工程而言,一旦混合到一起去,对整个工程的理解和调用,将会造成很大困扰,本文就汇总这几种常见编译结果文件 ...
- 特征变化--->索引到标签的转换(IndexToString)
package Spark_MLlib import org.apache.spark.ml.feature.{IndexToString, StringIndexer} import org.apa ...
- E20170628-hm
forgery n. 伪造; 伪造罪; 伪造物; 伪造签字; distribute vt. 分配,散布; 散发,分发; 把…分类; [电] 配电; contribute to(contribu ...
- [Swift通天遁地]八、媒体与动画-(5)使用开源类库绘制文字、图形、图像、图表、SVG(可缩放矢量图形)
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 【知识总结】后缀数组(Suffix_Array)
又是一个学了n遍还没学会的算法-- 后缀数组是一种常用的处理字符串问题的数据结构,主要由\(sa\)和\(rank\)两个数组组成.以下给出一些定义: \(str\)表示处理的字符串,长度为\(len ...
- hihocode 编程练习赛17
1. f1 score 首先了解f1 score的计算方法, 我记得是学信息检索知道的, 然后简单处理就行. 由于我写的比较麻烦, 中间处理过程引入了一些除数为0的情况,导致错了很多次.其实是很简单的 ...
- ACM_出题人这样不好吧
出题人这样不好吧 Time Limit: 2000/1000ms (Java/Others) Problem Description: 作为编协的第一次月赛,肯定是要有防AK(ALL KILL)的题目 ...
- 自定义View(9)使用Renderscript 渲染特效。
1.渲染脚本官网 https://developer.android.com/guide/topics/renderscript/compute 2.高斯模糊 ScriptIntrinsicBlur ...
- servlet范围:数据共享
数据共享: 请求转发:request.getDispatcher("相对路径").forward(request,response) 重定向:response.sendRedire ...