zoukankan      html  css  js  c++  java
  • 「日常训练」Common Subexpression Elimination(UVa-12219)

    今天做的题目就是抱佛脚2333 懂的都懂。

    这条题目干了好几天,最后还是参考别人的代码敲出来了,但是自己独立思考了两天多,还是有收获的。

    思路分析

    这条题我是先按照之前的那条题目(The SetStack Computer)的思路敲了半天,但是efficiency是贼鸡儿低,而且最后我搞不明白怎么输出结果了。。。。然后只好参考了这位同学的代码。思路大致是跟着lrj的走的,具体的实现有些需要注意的地方。

    代码

    #include <bits/stdc++.h>
    
    #define QUICKIO
    #define ALL(x) x.begin(),x.end()
    #define INS(x) inserter(x,x.begin())
    #define REP(x) for(int i=0;i!=(x);++i)
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    string str;
    int k,cnt;
    map<int,int> done;
    
    struct Tree
    {
        string op;
        int ls,rs;
        bool operator < (const Tree& rhs) const 
        {
            if(op!=rhs.op) return op<rhs.op;
            else if(ls!=rhs.ls) return ls<rhs.ls;
            else return rs<rhs.rs;
        }
    };
    
    map<Tree,int> treeMap;
    map<int,Tree> nodeMap;
    
    int solve()
    {
        string cur;
        while(isalpha(str[k])) cur.push_back(str[k++]);//这个贼鸡儿强,实现了一遍的遍历。想不到string类也能push_back...
        int id=++cnt;
        Tree& t=nodeMap[id];
        t.op=cur; t.ls=0;t.rs=0;
        if(str[k]=='(')
        {
            k++;
            t.ls=solve();k++;
            t.rs=solve();k++;
        }
        if(treeMap[t]) {cnt--;return treeMap[t];}//什么意思呢,就是如果这个结点之前已经保存过出现过了,我们就直接返回保存的值——这就是题意。cnt-1的原因如果懂函数的意思一下子就明白了。
        else return treeMap[t]=id;//这个节点没接触过。保存之。注意,我们保存的是之前的id,不是后来更新的,这个就保证了我们输出的方便。
    }
    void print(int u)
    {
        if(done[u]) cout<<u;//这个done数组用法我没有想到。一个数组解决了我之前有没有输出的问题。
        else
        {
            done[u]=1;
            cout<<nodeMap[u].op;
            if(nodeMap[u].ls)//递归处理。
            {
                cout<<"(";
                print(nodeMap[u].ls);
                cout<<",";
                print(nodeMap[u].rs);
                cout<<")";
            }
        }
        return;
    }
    
    int main()
    {
        int kase; cin>>kase;
        while(kase--)
        {
            treeMap.clear();
            done.clear();
            nodeMap.clear();
            cnt=k=0;
            cin>>str;
            print(solve());
            cout<<endl;
        }
        return 0;
    }

    思考

    简单的说下吧,算法都能想出来,但是实现不了。很多时候就是我们具体的实践能力不行。这种实践不行体现在很多“技巧”没法弄出来,但是这不是什么奇技淫巧,而是一些很重要的思路与技能。我们需要多多训练啊……

    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
  • 相关阅读:
    第四次博客
    第三次作业
    第二次作业
    入学的第一次作业
    第四次作业
    第三次作业
    第二次随笔作业
    第一次随笔
    第四次作业
    第三次作业
  • 原文地址:https://www.cnblogs.com/samhx/p/UVa-12219.html
Copyright © 2011-2022 走看看