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必须继续做下去,这是基本功.断不得. 题意分析 这条题真 ...
随机推荐
- Builder模式在Java中的应用(转)
在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...
- NavieBayes中的多项式与伯努力模型
1文本分类过程 例如文档:Good good study Day day up可以用一个文本特征向量来表示,x=(Good, good, study, Day, day , up).在文本分类中,假设 ...
- 基于ffmpeg的流媒体服务器
OS:ubuntu 12.04ffmpeg:N-47141-g4063bb2x264:0.133.2334 a3ac64b目标:使用ffserver建立流媒体服务器使用ffmpeg对本地文件流化(x2 ...
- android和ios流媒体库推荐
1基本信息编辑 Vitamio是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.从2011年8月上线到2014年1月,Vitamio 凭借其简洁易用的 ...
- strcpy函数和strncpy函数的区别
strcpy函数和strncpy函数的原型介绍在我的另一篇文章中介绍了,见strcpy,strncpy,strlen等函数原型 strcpy:字串复制 原型:char *strcpy(char *de ...
- C++实现网格水印之调试笔记(四)—— 完成嵌入
接下来的问题是,当模型是对称的时候,结果是符合预期的,但是当模型是不对称的时候,结果是错误的,如下: 输入: 顶点:233 输出: 这又是什么鬼...,我的马呢!!! 看来逻辑上还是有错误 注意这时候 ...
- bzoj 3275 Number(最小割)
[题意] 给定n个数,要求选出一些数满足 1.存在c,a*a+b*b=c*c 2.gcd(a,b)=1 使得和最大. [思路] 二分图的最大权独立集(可以这么叫么QAQ 先拆点,对于不满足条件的两个 ...
- android判断当前网络状态及跳转到设置界面
今天,想做这个跳转到网络设置界面, 刚开始用 intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 不料老是出现settings.Wirele ...
- kendoui-在线文本编辑器
文本编辑器用过很多,fckeditor是我之前用的最多的,但是问题也有很多,诸如安全问题,浏览器兼容问题..所以最近也一直在找替代产品,正好在研究kendo,所以就尝试了下kendo提供的edit控件 ...
- DRAM 内存介绍(一)
转载自博客大神迈克老狼的blog: http://www.cnblogs.com/mikewolf2002/archive/2012/11/13/2768804.html 参考资料:http://ww ...