题目链接: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的更多相关文章

  1. CodeForces 778B - Bitwise Formula

    题意: 选择一个 m 位的二进制数字,总分为 n 个算式的答案之和.问得到最低分和最高分分别应该取哪个二进制数字 分析: 因为所有数字都是m位的,高位的权重大于低位 ,我们就从高到低考虑 ans 的每 ...

  2. 【codeforces 779E】Bitwise Formula

    [题目链接]:http://codeforces.com/contest/779/problem/E [题意] 给你n个长度为m的二进制数 (有一些是通过位运算操作两个数的形式给出); 然后有一个未知 ...

  3. Codeforces Gym 100610 Problem E. Explicit Formula 水题

    Problem E. Explicit Formula Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...

  4. CodeForces 779E Bitwise Formula

    位运算,枚举. 按按分开计算,枚举$?$是$0$还是$1$,分别计算出$sum$,然后就可以知道该位需要填$1$还是$0$了. #include<map> #include<set& ...

  5. 【推导】【贪心】Codeforces Round #402 (Div. 2) E. Bitwise Formula

    按位考虑,每个变量最终的赋值要么是必为0,要么必为1,要么和所选定的数相同,记为2,要么和所选定的数相反,记为3,一共就这四种情况. 可以预处理出来一个真值表,然后从前往后推导出每个变量的赋值. 然后 ...

  6. Codeforces Problem 708A Letters Cyclic Shift

     题目链接: http://codeforces.com/problemset/problem/708/A 题目大意: 从字符串s中挑选出一个子串(非空),将该子串中的每个字母均替换成前一个字母,如' ...

  7. 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 ...

  8. codeforces problem 140E New Year Garland

    排列组合题 题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 只 ...

  9. Codeforces Problem 598E - Chocolate Bar

    Chocolate Bar 题意: 有一个n*m(1<= n,m<=30)的矩形巧克力,每次能横向或者是纵向切,且每次切的花费为所切边长的平方,问你最后得到k个单位巧克力( k <= ...

随机推荐

  1. 【HAOI 2008】 糖果传递

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1045 [算法] 环形均分纸牌问题 [代码] #include<bits/std ...

  2. [App Store Connect帮助]三、管理 App 和版本(6.1)转让 App:App 转让概述

    当您将某个 App 出售给其他开发者,或想要将其移至其他 App Store Connect 帐户或组织时,您需要转让该 App. 您无需将 App 从 App Store 下架,即可将其所有权转让给 ...

  3. Kafka详解与总结(四)

    Kafka消息分发和消费者push.pull机制 1. 消息分发 Producer客户端负责消息的分发 kafka集群中的任何一个broker都可以向producer提供metadata信息,这些me ...

  4. JavaScript--显示和隐藏(display属性)

    网页中经常会看到显示和隐藏的效果,可通过display属性来设置. 语法: Object.style.display = value 注意:Object是获取的元素对象,如通过document.get ...

  5. post提交表单的数据查看方式(不是很理解,但要会看,可以找人商讨下,比如崔老师,自己再看一遍HTTP基础)

  6. C#最实用的快捷键

    Ctrl+J(Alt+→):智能提示. Ctrl+X:删除整行. Shift+Alt+Enter:全屏切换 F12:跳转到定义. Ctrl+-.Ctrl+Shift+-:上一步.下一步(仅限于使用过上 ...

  7. 二次封装OKHttp网络框架(1)

    1. 框架功能简介:暂时只有get.post两个请求 2. 请求的主要流程和区别: 2.1 get请求: (1)创建请求客户的 OkHttpClient对象 (2)创建请求构建器 Request.Bu ...

  8. phpstorm如何在同一个文件夹打开多个目录

    phpstorm默认一个窗口只显示一个项目,如果新建一个项目,他会给你个选项卡,问你是在新窗口打开新项目还是在本窗口打开. 能不能在一个窗口打开多个项目呢?就像sublime text那样,其实是可以 ...

  9. win7 硬盘安装suse双系统启动顺序更改

    使用win7硬盘安装suse双系统之后,首先面临的问题是,PC默认启动的系统更改的问题,有些人可能想默认启动是win7,只有在使用linux的时候在去选择suse系统,这里我告诉大家更改的办法: 首先 ...

  10. linux shell & bash

    shell & bash shell指允许用户通过文本操作计算机的程序. interactive shell:从是否通过标准输入输出与用户进行交互的角度分为交互式shell(interacti ...