UVa 12219 Common Subexpression Elimination (stl,模拟,实现)
一般来说,把一颗子树离散成一个int,把一个结点的字符离散成一个int会方便处理
直接map离散。当然一个结点最多只有4个小写字母,也可以直接编码成一个27进制的整数,舍掉0,为了区分0和0000。
需要注意的是有可能只有一个结点。
#include<bits/stdc++.h>
using namespace std; const int maxlen = 5e5;
const int maxn = 5e4+;
char str[maxlen]; map<string,int> smp;
map<string,int>::iterator sit;
vector<string> scache;
#define PB push_back
struct Node
{
int l,r;
int sid;
int Hash;
bool operator < (const Node& x) const{
return sid<x.sid || (sid==x.sid && (l < x.l || (l == x.l && r < x.r) ));
}
}tr[maxn]; map<Node,int> mp;
map<Node,int>::iterator it;
#define se second
#define fi first
#define MP make_pair int id_cnt; int SID(string &s)
{
if((sit = smp.find(s)) != smp.end()) return sit->se;
scache.PB(s);
smp.insert(MP(s,scache.size()));
return scache.size();
} int ID(Node &nd)
{
if((it = mp.find(nd)) != mp.end()) return it->se;
mp.insert(MP(nd,id_cnt));
tr[id_cnt] = nd;
return id_cnt++;
} int build(int x,int &len)
{
Node u; u.Hash = ;
string s;
int i;
for(i = x; str[i]; i++){
if(str[i] == ',' || str[i] == ')'){
s.assign(str+x,str+i);
u.sid = SID(s);
len = s.size();
u.l = u.r = -;
return ID(u);
}else if(str[i] == '('){
s.assign(str+x,str+i);
u.sid = SID(s);
int lsz, rsz;
u.l = build(++i,lsz);
i += lsz;
u.r = build(++i,rsz);
len = s.size()+lsz+rsz+;
return ID(u);
}
}
s.assign(str+x,str+i);//只有一个结点
u.sid = SID(s);
u.l = u.r = -;
return ID(u);
} int dfs_clock; void dfs(int u)
{
if(!tr[u].Hash){
tr[u].Hash = ++dfs_clock;
printf("%s",scache[tr[u].sid-].c_str());
}else {
printf("%d",tr[u].Hash); return;
}
if(~tr[u].l){
putchar('(');
dfs(tr[u].l);
putchar(',');
dfs(tr[u].r);
putchar(')');
}
} int main()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d\n",&T);
while(T--){
gets(str);
mp.clear(); id_cnt = ;
scache.clear(); smp.clear();
int len;
int root = build(,len);
dfs_clock = ;
dfs(root);putchar('\n');
}
return ;
}
UVa 12219 Common Subexpression Elimination (stl,模拟,实现)的更多相关文章
- UVA 12219 Common Subexpression Elimination
题意: 求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号. 分析: 用map<string,int>smp;存放子树对应的字符串,如果以后出现相同的子树则用相同编号表示. ...
- 【uva 12219】Common Subexpression Elimination(图论--树+自定义比较器+映射+递归)
题意:如题,用表达式树来表示一个表达式,且消除公共的部分,即用编号表示.编号 K 定义为表达式第 K 个出现的字符串. 解法:先构造表达式树,给每棵子树用(string,left_son,right_ ...
- 「日常训练」Common Subexpression Elimination(UVa-12219)
今天做的题目就是抱佛脚2333 懂的都懂. 这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的. 思路分析 做这条题我是先按照之前的那条题目(The SetSt ...
- stl+模拟 CCF2016 4 路径解析
// stl+模拟 CCF2016 4 路径解析 // 一开始题意理解错了.... #include <iostream> #include <string> #include ...
- 【STL+模拟】UVa 506 - System Dependencies
System Dependencies Components of computer systems often have dependencies--other components that m ...
- UVA - 11995 - I Can Guess the Data Structure! STL 模拟
There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. ...
- uva 327 Evaluating Simple C Expressions 简易C表达式计算 stl模拟
由于没有括号,只有+,-,++,--,优先级简单,所以处理起来很简单. 题目要求计算表达式的值以及涉及到的变量的值. 我这题使用stl的string进行实现,随便进行练手,用string的erase删 ...
- STL——模拟实现空间配置器
目录 问题 SGI版本空间配置器-std::alloc 一级空间配置器 二级空间配置器 Refill.chunkAlloc函数 最后,配置器封装的simple_alloc接口 问题 我们在日常编写C+ ...
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
随机推荐
- jQuery EasyUI API 中文文档 - Tree树使用介绍
用 $.fn.tree.defaults 重写了 defaults. 依赖 draggable droppable 用法 Tree 能在 <ul> 元素里定义,此标记可以定义为叶节点和子节 ...
- SmartSql使用教程(3)——SmartSql中的事务,及AOP的使用
一.引言 经过两章的铺垫,我们现在对SmartSql已经有了一定的了解,那么今天我们的主题是事务处理.事务处理是常用的一种特性,而SmartSql至少提供了两种使用事务的方法.一种是通过Reposit ...
- 【阿里云IoT+YF3300】1.时代大背景下的阿里云IoT物联网的现状和未来
“未来十到二十年,大家基本已经形成了一个共识,那便是新格局的奠定将由 AI 和物联网技术来支撑.放眼国内,在这些互联网巨头之中,未来真正成为竞争对手厮杀的,阿里和华为是首当其冲,在这两个领域双方分别暗 ...
- MYSQL5.7版本解决sql_mode=only_full_group_by问题
在安装有些二开框架时会遇到下面的问题,在填写完数据库密码之后他会提示你请在mysql配置文件中修改ql-mode去掉ONLY_FULL_GROUP_BY,但是我们去mysql的配置文件中查找此配置,有 ...
- 模型验证 IValidatableObject 无法进入 Validate 方法的原因
模型的属性的类型为 decimal 时无法进入 Validate 方法 public decimal Age { get; set; } 当把属性的类型改为可空类型时 则可以进入 Validate 方 ...
- Codevs 1312 连续自然数和
1312 连续自然数和 题目描述 Description 对于一个自然数M,求出所有的连续的自然数段,使得这些连续自然数段的全部数字和为M.eg:1998+1999+2000+2001+2002=10 ...
- 洛谷P2473 [SCOI2008]奖励关(期望+状压)
传送门 我数学期望还是太差了…… 先考虑状压模型,设$dp[i][S]$表示第$i$轮,当前宝物状态为$S$,能获得的最大期望分数 然而这个模型有一个问题,第$i$轮不一定能达到状态$S$ 那么考虑转 ...
- assembly x86(nasm)修改后的日常
data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;9,3 sun1 db 'SUN' swcount db 0ah ...
- MySQL习题1 一对多实例 产品和分类
/* 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- ----------------- ...
- 51Nod 1272 最大距离 (栈或贪心)
#include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...