【紫书】(UVa12219)Common Subexpression Elimination
2017-10-21 13:24
337 查看
今天做的题目就是抱佛脚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; }
思考
简单的说下吧,算法都能想出来,但是实现不了。很多时候就是我们具体的实践能力不行。这种实践不行体现在很多“技巧”没法弄出来,但是这不是什么奇技淫巧,而是一些很重要的思路与技能。我们需要多多训练啊……相关文章推荐
- hash 表达式树 UVa 12219 Common Subexpression Elimination
- [hash 表达式树]UVa12219 - Common Subexpression Elimination
- UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
- UVA 12219 Common Subexpression Elimination——map
- uva 12219 Common Subexpression Elimination
- UVA 12219 Common Subexpression Elimination(表达式树)
- 判断相同的子树--uva12219 Common Subexpression Elimination
- UVA-12219 Common Subexpression Elimination
- UVA 12219 Common Subexpression Elimination (dfs瞎搞)
- UVA 12219 Common Subexpression Elimination(STL)
- Common Subexpression Elimination UVA - 12219
- 12219 - Common Subexpression Elimination(表达式树)
- UVa #12219 Common Subexpression Elimination (例题11-1)
- uva12219 Common Subexpression Elimination
- UVa 11536 - Smallest Sub-Array(尺取法)
- MS-SQL2005新特性(Common Table Expression)
- uva 10405 Longest Common Subsequence
- uva-10252-Common Permutation
- UVa 836 - Largest Submatrix
- 公用表表达式(Common Table Expression)