「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂。
这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的。
思路分析
做这条题我是先按照之前的那条题目(The SetStack Computer)的思路敲了半天,但是efficiency是贼鸡儿低,而且最后我搞不明白怎么输出结果了。。。。然后只好参考了这位同学的代码。思路大致是跟着lrj的走的,具体的实现有些需要注意的地方。
代码
#include <bits/stdc++.h>#define QUICKIO
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define REP(x) for(int i=0;i!=(x);++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
string str;
int k,cnt;
map<int,int> done;struct Tree
{string op;int ls,rs;bool operator < (const Tree& rhs) const {if(op!=rhs.op) return op<rhs.op;else if(ls!=rhs.ls) return ls<rhs.ls;else return rs<rhs.rs;}
};map<Tree,int> treeMap;
map<int,Tree> nodeMap;int solve()
{string cur;while(isalpha(str[k])) cur.push_back(str[k++]);//这个贼鸡儿强,实现了一遍的遍历。想不到string类也能push_back...int id=++cnt;Tree& t=nodeMap[id];t.op=cur; t.ls=0;t.rs=0;if(str[k]=='('){k++;t.ls=solve();k++;t.rs=solve();k++;}if(treeMap[t]) {cnt--;return treeMap[t];}//什么意思呢,就是如果这个结点之前已经保存过出现过了,我们就直接返回保存的值——这就是题意。cnt-1的原因如果懂函数的意思一下子就明白了。else return treeMap[t]=id;//这个节点没接触过。保存之。注意,我们保存的是之前的id,不是后来更新的,这个就保证了我们输出的方便。
}
void print(int u)
{if(done[u]) cout<<u;//这个done数组用法我没有想到。一个数组解决了我之前有没有输出的问题。else{done[u]=1;cout<<nodeMap[u].op;if(nodeMap[u].ls)//递归处理。{cout<<"(";print(nodeMap[u].ls);cout<<",";print(nodeMap[u].rs);cout<<")";}}return;
}int main()
{int kase; cin>>kase;while(kase--){treeMap.clear();done.clear();nodeMap.clear();cnt=k=0;cin>>str;print(solve());cout<<endl;}return 0;
}
思考
简单的说下吧,算法都能想出来,但是实现不了。很多时候就是我们具体的实践能力不行。这种实践不行体现在很多“技巧”没法弄出来,但是这不是什么奇技淫巧,而是一些很重要的思路与技能。我们需要多多训练啊……
转载于:https://www.cnblogs.com/samhx/p/UVa-12219.html
「日常训练」Common Subexpression Elimination(UVa-12219)相关推荐
- 「日常训练」 Mike and Fun (CFR305D2B)
题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...
- 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)
题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...
- 「日常训练」Skills(Codeforce Round #339 Div.2 D)
题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...
- 「日常训练」Alternative Thinking(Codeforces Round #334 Div.2 C)
题意与分析 (CodeForces - 603A) 这题真的做的我头疼的不得了,各种构造样例去分析性质... 题意是这样的:给出01字符串.可以在这个字符串中选择一个起点和一个终点使得这个连续区间内所 ...
- 「日常训练」 Genghis Khan the Conqueror(HDU-4126)
题意 给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通.但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条 ...
- TVM TIR Pass - CSE (Common Subexpression Elimination) 优化原理和代码解析 PR#9482
理论 预备知识 TIR Let Binding Let (var, value, body) 将value求值赋给var,然后返回body的求值结果.let将表达式 Expr 绑定到局部作用域的不可变 ...
- 「分布式训练」使用 DDP 实现程序单机多卡并行指南
最近在大趋势的影响下,开始染指大模型.由于实验室计算资源的限制,需要使用单机多卡并行的方式运行程序,这里以 BLOOM-560m 模型为例,演示如何通过单机多卡DDP并行的方式微调完成下游任务. 目录 ...
- 「日常训练知识学习」树的直径(POJ-1849,Two)
题意 一个城市由节点和连接节点的街道组成,街道是双向的. 此刻大雪覆盖了这个城市,市长确定了一些街道要将它们清扫干净,这些街道保证所有的节点可以通过它们连通而且街道数目尽可能小. 现有两台相同的扫雪机 ...
- 「模型训练」如何迁移学习一个小网络到移动端
https://www.toutiao.com/i6715373426858525198/ 作者 | 言有三 编辑 | 言有三 0 引言 现在很多的图像算法都是离线计算的,而学术界刷榜单那些模型,什么 ...
最新文章
- 深度学习框架PyTorch快速开发与实战
- WinSock网络编程实用宝典(一)
- HBase 0.98 分布式集群安装详解
- Oracle EBS R12.1.1 应用克隆 - 3
- Hadoop赠品–综述
- python用pip安装numpy完整命令_Python使用pip安装Numpy模块
- 又烧一辆!蔚来ES8车库夜里起火 两个半小时才熄灭:现场惨烈
- java弱口令生成1001无标题,教你批量生成自动发卡平台需要的卡密数据
- 阿里云天池 Docker练习场(入门赛) 操作步骤
- Python 3.x对.CSV数据按任意行、列读取
- 你的网站上显示Alexa世界排名的代码(表)
- linux服务器raid逻辑盘迁移,raid空闲盘的热迁移
- python动态心形代码-python心形代码
- SMT Kingdom v8.5 地震解释软件\
- python怎么算积分_Python求解数值积分-定积分求解
- HTML 限制文本框只能输入特定字符(比如数字 onkeyup+onafterpaste)
- 百度地图api设置点的自定义图标不显示
- 一个利用html5的图片裁剪功能(已解决ios压扁缩放等bug)
- python课后感想_谈谈对Python的感想
- HX711称重模块的使用
热门文章
- 自动控制理论及matlab,自动控制理论及MATLAB实现
- nitrous.io mysql_云IDE:Nitrous.io的介绍以及活用手段
- 得到的概率值_论文推荐|屋面钢梁在超强意外雪荷载作用下的失效概率
- linux vim模板,FreeBSD8下的vim配置模板
- mysql peferences_MySQL初次实践
- 033_NavMenu导航菜单
- android 打卡app,日常小打卡app
- centos mysql 5.1_CentOS下的MySQL 5.1安装
- Fragment全解析系列
- Permission denied error: unable to index file .vs/Trip2015/v15/Server/sqlite3/db.lock fatal: adding