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必须继续做下去,这是基本功.断不得. 题意分析 这条题真 ...
随机推荐
- UVA 350 Pseudo-Random Numbers 伪随机数(简单)
题意:给定Z, I, M, L,根据随机数产生式k=(Z*L+I)%M.但是L表示的是上一个产生的数,比如根据产生式产生了序列{2,5,4,3}那么5是由L=2算来的,4由L=5算来的..第1个所产 ...
- 数据库语言(三):MySQL、PostgreSQL、JDBC
MySQL MySQL资料很多,这里只给出一个在论坛博客中最常用的操作:分页 mysql> select pname from product limit 10,20; limit的第一个参数是 ...
- poj 2773 Happy 2006
// 题意 :给你两个数 m(10^6),k(10^8) 求第k个和m互质的数是什么这题主要需要知道这样的结论gcd(x,n)=1 <==> gcd(x+n,n)=1证明 假设 gcd(x ...
- SpringMVC——hello SpringMVC
概述: Spring的web框架围绕DispatcherServlet设计. DispatcherServlet的作用是将请求分发到不同的处理器. 与其它web MVC框架一样,Spring的web ...
- 利用c#反射实现实体类生成以及数据获取与赋值
转:http://hi.baidu.com/xyd21c/item/391da2fc8fb351c10dd1c8b8 原有的实体类成员逐个赋值与获取的方法弊端: 1.每次对实体类属性进行赋值时,都要检 ...
- Android-判断当前网络是否可用
1.声明权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 2. ...
- Linux User's Manual IOSTAT
IOSTAT(1) Linux User's Manual IOSTAT(1) NAME iostat - Report Central Processing Unit (CPU) statistic ...
- 9月5日 华为2014校园招聘的机试题目_C语言版答案
手有些生了. 题目: 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串.压缩规则:1.仅压缩连续重复出现的字符.比如 ...
- HDU 5437 Alisha’s Party
题意:有k个人带着价值vi的礼物来,开m次门,每次在有t个人来的时候开门放进来p个人,所有人都来了之后再开一次门把剩下的人都放进来,每次带礼物价值高的人先进,价值相同先来先进,q次询问,询问第n个进来 ...
- 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(2)
安装和配置集群(Installing and Configuring your Cluster) 第一步是确保正确安装了 Java SE环境.ElasticSearch需要版本6或更高的版本,可以从下 ...