zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
    }
  • 相关阅读:
    粘包现象
    SOCKET的简单介绍
    jQuery基本语法
    Bet(The 2016 ACM-ICPC Asia China-Final Contest 思路题)
    World Cup(The 2016 ACM-ICPC Asia China-Final Contest dfs搜索)
    Number Theory Problem(The 2016 ACM-ICPC Asia China-Final Contest 找规律)
    HDU
    Yin and Yang Stones(思路题)
    在线数学公式编译器
    HDU
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4907514.html
Copyright © 2011-2022 走看看