码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 12219 Common Subexpression Elimination

时间:2015-10-24 20:31:15      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

题意:

  求最小的表达式树,也就是把相同的表达式子树给替换成最前面相同的编号。

分析:

  用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

标签:

原文地址:http://www.cnblogs.com/137033036-wjl/p/4907514.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!