今天做的题目就是抱佛脚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;
}

思考

简单的说下吧,算法都能想出来,但是实现不了。很多时候就是我们具体的实践能力不行。这种实践不行体现在很多“技巧”没法弄出来,但是这不是什么奇技淫巧,而是一些很重要的思路与技能。我们需要多多训练啊……

「日常训练」Common Subexpression Elimination(UVa-12219)的更多相关文章

  1. 「日常训练」COMMON 约数研究(HYSBZ-1968)

    题意与分析 感谢https://www.cnblogs.com/Leohh/p/7512960.html的题解.这题话说原来不在我的训练范围,正好有个同学问我,我就拿来做做.数学果然不是我擅长的啊,这 ...

  2. 「日常训练」ZgukistringZ(Codeforces Round #307 Div. 2 B)

    题意与分析(CodeForces 551B) 这他妈哪里是日常训练,这是日常弟中弟. 题意是这样的,给出一个字符串A,再给出两个字符串B,C,求A中任意量字符交换后(不限制次数)能够得到的使B,C作为 ...

  3. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  4. 「日常训练」 Mike and Fun (CFR305D2B)

    题意(CodeForces 548B) 每次对01矩阵中的一位取反,问每次操作后,单列中最长连续1的长度. 分析 非常非常简单,但是我当时训练的时候WA了四次...无力吐槽了,人间 不值得.jpg 代 ...

  5. 「日常训练」Magic Stones(CodeForces-1110E)

    题意 给定两个数组c和t,可以对c数组中的任何元素变换\(c_i\)​成\(c_{i+1}+c_{i-1}-c_i\)​,问c数组在若干次变换后能否变换成t数组. 分析 这种魔法题目我是同样的没做过. ...

  6. 「日常训练」Jongmah(Codeforces-1110D)

    题意 你有n个数字,范围[1, m],你可以选择其中的三个数字构成一个三元组,但是这三个数字必须是连续的或者相同的,每个数字只能用一次,问这n个数字最多构成多少个三元组? 分析 根据官方Editori ...

  7. 「日常训练」The Necklace(UVA-10054)

    代码 for(int i=0; i!=n; ++i) { int u = cin.nextInt(); int v = cin.nextInt(); edges.add(new Edge(u,v)); ...

  8. 「日常训练」Known Notation(ZOJ-3829)

    题意与分析 题意是这样的:给一个字符串,字符串中只包含数字和运算符'*'.现在问字符串是不是一个合法的逆波兰式(后缀表达式).已知逆波兰式的空格消除,也就是说123可以看成123也可以看成1和23.如 ...

  9. 「日常训练」 Genghis Khan the Conqueror(HDU-4126)

    题意 给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通.但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条 ...

随机推荐

  1. ZOJ 1610 Count the Colors【题意+线段树区间更新&&单点查询】

    任意门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1610 Count the Colors Time Limit: 2 ...

  2. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  3. HTML中什么时候加px

    如:<img width="800" height="600" src="#"/> 不加后面的px;  #center{     ...

  4. ffmpeg一些filter用法、以及一些功能命令

    来源:http://blog.csdn.net/dancing_night/article/details/46776903 1.加字幕 命令:ffmpeg -i <input> -fil ...

  5. 课时89.CSS三大特性练习(理解)

    给大家补充一点:通配符是不参与权重计算的,因为通配符的权重是0,而权重只计算id,类,标签,将来还有一种,到后面说. 练习1 直接选中和间接选中的,必然要听直接选中的. 练习2 直接选中一共有两个,直 ...

  6. 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f4-hystrix/ 本文出自方志朋的博客 在微服务架构中, ...

  7. PL/SQL12的安装与使用

    楼主比较懒,直接放一个别人的链接吧,比较全面. 大致过程就是,下载pl/sql    下载oracle instance client    然后配置oci.dll     添加 一个连接具体数据库的 ...

  8. vim 输入特殊字符

    在VIM中可以通过二合字符和十进制进行输入, 在输入模式中,Ctrl + V, 十进制 在输入模式中,Ctrl + K, 二合字符(区分大小写) 注意:特殊字符也算一个字节 通过用的^@是为了保证结尾 ...

  9. fjutacm 2492 宠物收养所 : Splay 模板 O(nlogn)

    /** problem: http://www.fjutacm.com/Problem.jsp?pid=2492 Splay blog: https://tiger0132.blog.luogu.or ...

  10. centos7-mongodb3.4.6集群的搭建

    0.需要环境 安装包:mongodb-linux-x86_64-3.4.6.tgz 安装路径:/usr/mongodb 服务器: 192.168.177.131/132/133 mongos 2000 ...