UVA12219
//by Rujia Liu
/*
字符串的对比是缓慢的。
鉴于这道题最多只有四个小写字母,
也就是最多26*4种情况,
我们完全可以用整数来代替字符串。
一种比较简单的做法是把字符串看成一个四位的27进制数,
并抛弃0,因为0和0000相等。
*/
#include<cstdio>
#include<cctype>
#include<string>
#include<map>
using namespace std;
;
int T, kase, cnt;
], *p;
int done[maxn];
struct Node { //一个结点存储了
string s;
int hash, left, right;
bool operator < (const Node& rhs) const { //定义一个全序,用于map
if(hash != rhs.hash) return hash < rhs.hash;
if(left != rhs.left) return left < rhs.left;
return right < rhs.right;
}
} node[maxn];
map<Node,int> dict;
int parse() {
int id = cnt++;
Node& u = node[id];
u.left = u.right = -;
u.s = "";
u.hash = ;
while(isalpha(*p)) {
u.hash = u.hash * + *p - ;
u.s.push_back(*p);
p++;
}
if (*p == '(') { // (L,R)
p++; u.left = parse(); p++; u.right = parse(); p++;
}
) {
//先建好一个结点,然后看这个结点是不是已经有了,如果有了这个结点就不必建了
cnt--;
return dict[u];
}
return dict[u] = id;
}
void print(int v) { //打印结果,kase用于标记
if(done[v] == kase)
printf();
else {
done[v] = kase;
printf("%s", node[v].s.c_str());
) {
putchar('(');
print(node[v].left);
putchar(',');
print(node[v].right);
putchar(')');
}
}
}
int main() {
scanf("%d", &T);
; kase <= T; kase++) {
dict.clear();
cnt = ;
scanf("%s", expr);
p = expr;
print(parse());
putchar('\n');
}
;
}
UVA12219的更多相关文章
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- UVa 12219 公共表达式消除
https://vjudge.net/problem/UVA-12219 题意: 用表达式树来表示一个表达式. 思路: 用map来记录出现过的子树.如(b,3,6)表示这棵子树的根为b,左子树为编号为 ...
- 【紫书】(UVa12096) The SetStack Computer
突然转进到第五章的low题目的原因是做到图论了(紫书),然后惊喜的发现第一题就做不出来.那么里面用到了这一题的思想,我们就先解决这题.当然,dp必须继续做下去,这是基本功.断不得. 题意分析 这条题真 ...
随机推荐
- js 写成类的形式 js 静态变量 js方法 属性 json类
function ClassStudentList() { //[{"Cid":"0d","Students":[{"Sid&qu ...
- fastdfs-client-java 文件上传
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相 ...
- MYSQL的分区字段,必须包含在主键字段内
MYSQL的分区字段,必须包含在主键字段内 MYSQL的分区字段,必须包含在主键字段内 在对表进行分区时,如果分区字段没有包含在主键字段内,如表A的主键为ID,分区字段为createtime ,按 ...
- python - pip 从已有的安装列表 安装
已经安装好的机器:sudo pip freeze > install_list.list 需要安装的机器:sudo pip install -r install_list.list
- 也谈http中get和post
1.get和post区别: 从设计初衷考虑get是为了查询服务器资源(不改变服务器数据及状态,因此说它是安全和幂等的,但get请求参数一般是直接在url后面,浏览器地址栏中会被看到能保存书签及历史记录 ...
- Json::Value使用心得
Json::Value 是sourceforge开源项目jsoncpp的数据对象,用来处理json数据 下载 1.打印Json数据 Json::Value jv; Json::FastWriter ...
- Most Powerful(ZOJ 3471状压dp)
题意:n个原子,两两相撞其中一个消失,产生能量,给出任意两原子相撞能产生的能量,求能产生的最大能量. 分析:dp[i]表示情况为i时产生的最大能量 /*#include <map> #in ...
- HDU 5776 sum (BestCoder Round #85 A) 简单前缀判断+水题
分析:就是判断简单的前缀有没有相同,注意下自身是m的倍数,以及vis[0]=true; #include <cstdio> #include <cstdlib> #includ ...
- delegate 为什么用 weak属性
weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此是儿子的所有者:但是为了阻止所有权回环,儿子需要使用weak指针指向父亲:你的viewcontroller通过strong指 ...
- IOS 屏幕截图 UIScrollview
//截图UIView:截全图 -(UIImage*)captureView:(UIView *)theView{ CGRect rect = theView.frame; if ([theView i ...