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 <= ...
随机推荐
- Python:SMOTE算法——样本不均衡时候生成新样本的算法
Python:SMOTE算法 直接用python的库, imbalanced-learn imbalanced-learn is a python package offering a number ...
- influx测试——单条读性能很差,大约400条/s,批量写性能很高,7万条/s,总体说来适合IOT数据批量存,根据tag查和过滤场景,按照时间顺序返回
测试准备 需要将InfluxDB的源码放入 go/src/github.com/influxdata 目录 单写测试代码(write1.go): package main import ( " ...
- 洛谷P2340 奶牛会展
题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成 ...
- 收集主机OS相关数据
#!/usr/bin/ksh touch hostinfo$(date +%Y%m%d).csv filename=hostinfo$(date +%Y%m%d).csv >${filename ...
- [App Store Connect帮助]一、 App Store Connect 使用入门(4)iOS 版 App Store Connect
通过 iOS 版 App Store Connect,您可以在移动设备上查看销售数据.App 元数据和顾客评论.您还可以检查 App 状态.发布您 App 的新版本并回应“Resolution Cen ...
- [Swift通天遁地]四、网络和线程-(1)线程的锁和解锁
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]五、高级扩展-(8)ImageView(图像视图)的各种扩展方法
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]七、数据与安全-(14)使用单元测试进行邮箱格式的验证
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Coursera公开课-Machine_learing:编程作业7
这周的编程作业主要是两方面内容. 1.K-means聚类. 2.PCA(Principle Component Analys)主成分分析. 方式主要是通过对图像的聚类实现压缩图像,后来发现PCA也可以 ...
- Linux查找目录下的按时间过滤的文件
在维护项目中,有时会指定都一些条件进行过滤文件,并对该批文件进行操作:这时我们将使用shell命令进行操作:直接上代码 #!/bin/sh #BEGIN #`find ./ ! -name " ...