题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示。编号 K 定义为表达式第 K 个出现的字符串。

解法:先构造表达式树,给每棵子树用(string,left_son,right_son)-->(哈希值,...,...)编号。由于最多出现4个小写字母,所以可以用27进制数表示,同时也要利用好映射map的count(),和对应的dict[]的编号。

再递归输出表达式,利用编号的定义,看输出编号或字符串。

注意——这里的自定义比较器用的是“显式定义”,若是2个键值排序,还可以用专门把2个类型捆绑到一起的pair,它默认先比较第一关键字 .first,再是第二关键字 .second——

定义排序:typedef pair<int,int> pii[]; 再加优先队列 或 cmp函数
赋值: pii[]=make_pair(x,y);

P.S.我是参考着紫书做着Rujia Liu的代码打着,但如名,我这konjac蒟蒻改成了一个我自己能够记得的代码~所以,这题主要是提高代码能力,hh~

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<map>
5 #include<iostream>
6 using namespace std;
7 const int N=50010;
8
9 char ss[7*N];
10 struct node
11 {
12 char s[6];
13 int hash,lc,rc,l;
14 bool operator < (const node& x) const
15 {
16 if (hash!=x.hash) return hash<x.hash;
17 if (lc!=x.lc) return lc<x.lc;
18 return rc<x.rc;
19 }
20 }a[N];
21 map<node,int> dict;
22 bool v[N];
23 int len,p;
24
25 int build()
26 {
27 int id=++len,t=p;
28 node& u=a[id];
29 u.hash=0,u.lc=u.rc=-1,u.l=0;
30 while (ss[p]>='a'&&ss[p]<='z')
31 {
32 u.hash=27*u.hash+ss[p]-'a'+1;
33 u.s[p-t+1]=ss[p];
34 p++;
35 }
36 u.l=p-t;
37 if (ss[p]=='(')
38 {
39 p++,u.lc=build();
40 p++,u.rc=build();
41 p++;
42 }
43 if (dict.count(u)) {len--;return dict[u];}
44 dict[u]=id;
45 return dict[u];
46 }
47
48 void print(int x)
49 {
50 if (v[x]) {printf("%d",x);return;}
51 v[x]=1;
52 for (int i=1;i<=a[x].l;i++) printf("%c",a[x].s[i]);
53 if (a[x].lc!=-1)
54 {
55 printf("(");
56 print(a[x].lc);
57 printf(",");
58 print(a[x].rc);
59 printf(")");
60 }
61 }
62
63 int main()
64 {
65 int T;
66 scanf("%d",&T);
67 while (T--)
68 {
69 len=0,p=1;
70 dict.clear();
71 scanf("%s",ss+1);
72 memset(v,0,sizeof(v));
73 print(build());
74 printf("\n");
75 }
76 return 0;
77 }

【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)的更多相关文章

  1. UVA 12219 Common Subexpression Elimination

    题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...

  2. UVa 12219 Common Subexpression Elimination (stl,模拟,实现)

    一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理 直接map离散.当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000. ...

  3. 「日常训练」Common Subexpression Elimination(UVa-12219)

    今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...

  4. POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 1220 Party at Hali-Bula(树型动态规划)

    POJ 3342 Party at Hali-Bula / HDU 2412 Party at Hali-Bula / UVAlive 3794 Party at Hali-Bula / UVA 12 ...

  5. SortedMap接口的实现类TreeMap介绍和实现Comparator自定义比较器(转)

    与SortedSet接口类似,SortedMap也是一个结构,待排序的Map,其一个比较常用的实现类是TreeMap. TreeMap的put(K key, V value)方法在每添加一个元素时,都 ...

  6. 通过自定义比较器排序(C#版)

    一.方法概述 自定义比较器需要实现接口IComparer<T> 二.示例过程 1.新建一个Product产品类 /// <summary> /// 产品类 /// </s ...

  7. Java中的equals方法和自定义比较器

    Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...

  8. (13)处理静态资源(自定义资源映射)【从零开始学Spring Boot】

    上面我们介绍了Spring Boot 的默认资源映射,一般够用了,那我们如何自定义目录? 这些资源都是打包在jar包中的,然后实际应用中,我们还有很多资源是在管理系统中动态维护的,并不可能在程序包中, ...

  9. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

随机推荐

  1. python的默认参数的一个坑

    前言 pass 正文 在 https://docs.python.org/3/tutorial/controlflow.html#default-argument-values 中,有这样一段话 Im ...

  2. 【Linux】vim关闭终端的时候,忘记退出vim怎么办

    有些时候经常是关闭终端,但是忘记退出vim编辑的文本,每次登陆的时候会提示这个错误 其实很简单,在该文本的路径下,有一个隐藏文件 叫.xxx.txt.swp文件(xxx就是你退出忘记关闭的文件名). ...

  3. SDUST数据结构 - chap6 树与二叉树

    判断题: 选择题: 函数题: 6-1 求二叉树高度: 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef char ...

  4. 网件wndr4300 ttl连接

    路由成砖而还能进入cfe或uboot等情况下,可以通过ttl快速救砖. r4300主板有TTL的接线脚,脚的顺序可以找在OpenWrt的wiki上找到. 如下图4个TTL针在左下角,从下往上分别是GN ...

  5. git创建分支并关联远程分支

    1.新建本地分支: 如图,再输入你的分支名字,然后选择从哪个远程分支拉代码,如选择master 至此本地分支创建完成. 2.关联远程分支: (1).先输入git branch -vv,看看分支与远程分 ...

  6. Electron入门Demo之桌面应用计算器笔记(二)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14307996.html 在之前总结了一篇自学笔记,通过之前学习到的方法和知识,完成了 ...

  7. C++:标准I/O流

    标准I/O对象:cin,cout,cerr,clog cout; //全局流对象 输出数据到显示器 cin; //cerr没有缓冲区 clog有缓冲区 cerr; //标准错误 输出数据到显示器 cl ...

  8. 在EXCEL中如何同时冻结行与列?

    鼠标所在的单元格的位置 ,决定了你冻结的行和列.如: 冻结第一行与第一列, 只需要将鼠标置于单元格在第二列,第二行. 点击冻结

  9. MySQL简介及安装 mysql Ver 14.14 Distrib 5.7.28

    1.MySQL简介 1.数据库产品演变 第一代数据库架构: RDBMS 关系型数据库时代 : 合的时代 代表产品 :Oracle .MSSQL .MySQL.SQL server 第二代数据库架构:拆 ...

  10. 网易新闻App架构重构实践:DDD正走向流行

    网易新闻App架构重构实践:DDD正走向流行 https://mp.weixin.qq.com/s/FdwrT_xn3CQqpWoRVBttvQ 小智 InfoQ 2020-05-14 作者 | 小智 ...