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 ...
随机推荐
- C. Pearls in a Row
C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Quartz实现定期运行程序(Java)
package Quartz; import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; imp ...
- 洛谷1601 A+B Problem(高精) 解题报告
洛谷1601 A+B Problem(高精) 本题地址:http://www.luogu.org/problem/show?pid=1601 题目背景 无 题目描述 高精度加法,x相当于a+b pro ...
- C#基础:通过委托给任何对象数组进行排序
在日常编写程序的时候,我们需要对一些对象进行排序,比如对int数组进行排序,自定义类数组进行排序,首先我们先讨论对数组进行排序,我们应该对冒泡排序比较熟悉,下面是数组用冒泡排序的方法 for (int ...
- sql #与$的区别
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是i ...
- ZOJ3164【区间dp】
题意: 有n个人,有一种关系叫做8g关系,给出m个关系,给出n个人的阵列 问你最多能拿走多少人,拿走以后相邻就是相邻了 思路: 典型的区间dp: dp[i][j] 代表 i-j 最多能去多少人: 如 ...
- JavaScript之——对象Object(一)
1. 新建对象.删除和访问: (1).新建 var obj1 = {b: 2}; //对象文本表示法 var obj2 = new Object(); obj2.a = 1; (2).访问 //第一种 ...
- [Xcode 实际操作]九、实用进阶-(5)使用正则表达式判断格式是否正确
目录:[Swift]Xcode实际操作 本文将演示使用正则表达式判断邮箱的格式是否正确. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...
- 自然语言处理(二)——PTB数据集的预处理
参考书 <TensorFlow:实战Google深度学习框架>(第2版) 首先按照词频顺序为每个词汇分配一个编号,然后将词汇表保存到一个独立的vocab文件中. #!/usr/bin/en ...
- log4j和log4j2怎么动态加载配置文件
应用场景与问题 当项目在运行时,我们如果需要修改log4j 1.X或者log4j2的配置文件,一般来说我们是不能直接将项目停止运行再来修改文件重新部署的.于是就有这样一个问题:如何在不停止当前项目的运 ...