UVA 12219 Common Subexpression Elimination
题意:
求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号。
分析:
用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示。用build函数先根据输入的语句建树。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
const int maxlen = 5e5;
const int maxn = 5e4+1;
char str[maxlen];
map<string,int>smp;
map<string,int>::iterator sit;
vector<string>st;
struct node
{
int l,r;
int id;
int v;
bool operator < (const node& x) const{
return id<x.id || (id==x.id && (l < x.l || (l == x.l && r < x.r) ));
}
}tree[maxn];
map<node,int>mp;
map<node,int>::iterator it;
int cnt;
int dfs1;
int SID(string &s)
{
if((sit=smp.find(s))!=smp.end())
return sit->second;
st.push_back(s);
smp.insert(make_pair(s,st.size()));
return st.size();
}
int ID(node &nd)
{
if((it=mp.find(nd))!=mp.end())
return it->second;
mp.insert(make_pair(nd,cnt));
tree[cnt]=nd;
return cnt++;
}
int build(int x,int &len)
{
node u;
u.v=0;
string s;
int i;
for(i=x;str[i];i++)
{
if(str[i]==','||str[i]==')')
{
s.assign(str+x,str+i);
u.id=SID(s);
len=s.size();
u.l=u.r=-1;
return ID(u);
}
else if(str[i]=='(')
{
s.assign(str+x,str+i);
u.id=SID(s);
int lsz,rsz;
u.l=build(++i,lsz);
i+=lsz;
u.r=build(++i,rsz);
len=s.size()+lsz+rsz+3;
return ID(u);
}
}
s.assign(str+x,str+i);
u.id=SID(s);
u.l=u.r=-1;
return ID(u);
}
void dfs(int u)
{
if(!tree[u].v)
{
tree[u].v=++dfs1;
printf("%s",st[tree[u].id-1].c_str());
}
else
{
printf("%d",tree[u].v); return;
}
if(~tree[u].l)
{
putchar('(');
dfs(tree[u].l);
putchar(',');
dfs(tree[u].r);
putchar(')');
}
}
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
gets(str);
smp.clear();
mp.clear();
st.clear();
cnt=0;
int len;
int root=build(0,len);
dfs1=0;
dfs(root);
printf("\n");
}
}
UVA 12219 Common Subexpression Elimination的更多相关文章
- UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理 直接map离散.当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000. ...
- 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)
题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- uva 10252 - Common Permutation 字符串水题
题意:給定兩個小寫的字串a與b,請印出皆出現在兩字串中的字母,出現的字母由a~z的順序印出,若同字母出現不只一次,請重複印出但不能超過任一字串中出現的次數.(from Ruby兔) 很水,直接比较输出 ...
- 公共表达式消除(UVa 12219)
紫书354页的题,将表达式树进行公共表达式消除,化为等价的图.因为需要判断某一个是否出现过,所以需要快速比较,采用哈希表的形式,将a~b与1~27一一对应,不采用0,因为0与0000是相同的,对于每一 ...
- UVa 12219 公共表达式消除
https://vjudge.net/problem/UVA-12219 题意: 用表达式树来表示一个表达式. 思路: 用map来记录出现过的子树.如(b,3,6)表示这棵子树的根为b,左子树为编号为 ...
- 紫书 例题 11-1 UVa 12219 (表达式树)
这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- TensorFlow 源代码初读感受
把自己微博发的文章:http://www.weibo.com/1804230372/En7PdlgLb?from=page_1005051804230372_profile&wvr=6& ...
随机推荐
- ios8加入通知栏开始
ios8加入通知栏开始 by 吴雪莹 以打开vpn设置为例: @IBAction func open(sender: AnyObject) { let context = self.extension ...
- 基于angularJS和requireJS的前端架构
1.概要描述 1.1.angularJS描述:angularJS是可以用来构建WEB应用的,WEB应用中的一种端对端的完整解决方案.通过开发者呈现一个更高层次的抽象来简化应用的开发.最适合的就是用它来 ...
- 使用Xcode上传代码至GitHub
几乎所有iOS程序员都上过GitHub寻找开源类库,的确,GitHub上有大量优秀的开源类库供大家学习.但是如何在Xcode中上传代码至GitHub呢? (开始之前先安装git,具体方法这里讲的很清楚 ...
- 初入 Spring.net
IOC:Inversion Of Control 控制翻转:就是创建对象的权利由开发人员自己控制,转换到了由容器来控制 我用的是winform里的一个按键来触发的 首先要引入两个Spring.net的 ...
- js 去掉空格
写成类的方法格式如下:(str.trim();)<script language="javascript"> String.prototype.trim=functio ...
- android学习---屏幕旋转
/** *问题:今天学习android访问Servlet,Servlet给返回一个xml格式的字符串,android得到数据后将其显示到一个TextView中,发现Activity得到数据显 * 示到 ...
- autoresizing代码实现
主要解决父子控件之间的布局关系: /* Flexible 灵活的,自由的 typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) ...
- hdu2206IP的计算
Problem Description 在网络课程上,我学到了很多有关IP的知识.IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方 ...
- vs2012配置opencv及简单测试
为visual studio2012搭建openCV平台,实现打开图片. 实现步骤: 1.1.配置环境变量 基于win7操作系统的环境配置步骤: 1.1.1 计算机—>属性—>更改设置—& ...
- Linux下,命令 wget 的使用
wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行.这意味这你可以登录系统, ...