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必须继续做下去,这是基本功.断不得. 题意分析 这条题真 ...
随机推荐
- I.MX6 Goodix GT9xx touchscreen driver porting
/************************************************************************ * I.MX6 Goodix GT9xx touch ...
- spoj 694(后缀数组)
题意:求一个字符串的不重复子串的个数. 分析:对于下标为i的位置,能够产生的前缀子串个数为len-i(下标从0开始),对于与它字典序相邻的后缀产生的子串是重复的(就是他们的最长公共前缀),所以我们要减 ...
- C# winform 登录 单例模式(转)
主界面配置代码: frmLogin Codz program.cs 代码 static class Program { public static EventWaitHandle ProgramSta ...
- 微信多媒体上传图片,创建卡券上传 LOGO
//*****************************************多媒体上传图片 begin******************************************** ...
- LINQ to SQL语句之Join和Order By
Join操作 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这些实现对多个表的操作. 说明:在Join操作中,分别为Join(Join查询), SelectM ...
- ExcelUtils 导表实例
@RequestMapping("/dealer/chargebook/exportv.htm") public void getChargeBookList(int epm ...
- 在这个年纪,打DOTA冲分有那么可笑么?
大学四年,毕业两年,6年dota,总是在最无助的时候让心灵得到一丝安宁的东西,烟和dota. 我不知道dota对别人的意义是什么,一盘dota,在最多不超过1个半小时的时间里,仿佛经历了一个小人生,每 ...
- oc_转_NSInteger 和 NSNumber
Objective-C 支持的类型有两种:基本类型和类. 基本类型,如同 C 语言中的 int 类型一样,拿来就可以直接用.而类在使用时,必须先创建一个对象,再为对象分配空间,接着做初始化和赋值.类的 ...
- 【Hadoop代码笔记】Hadoop作业提交之Child启动map任务
一.概要描述 在上篇博文描述了TaskTracker启动一个独立的java进程来执行Map或Reduce任务.在本篇和下篇博文中我们会关注启动的那个入口是org.apache.hadoop.mapre ...
- RabbitMQ (三) 发布/订阅 -摘自网络
这篇博客中,我们会做一些改变,就是把一个消息发给多个消费者,这种模式称之为发布/订阅(类似观察者模式). 为了验证这种模式,我们准备构建一个简单的日志系统.这个系统包含两类程序,一类程序发动日志,另一 ...