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

公共表达式消除 uva 12219

时间:2018-04-09 23:13:14      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:struct   cout   tree   cstring   cin   include   void   cst   编号   

自己写的时候不知道怎么处理编号,看了别人的代码才发现可以预留编号,学习一个

今天才知道map需要处理好顺序才能正确查找

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
#define LL long long
#define maxn 50010
#define CLR(a,b) memset(a,b,sizeof(a))

struct tree
{
    string s;
    int lch;
    int rch;

    bool operator < (const tree &x ) const{
        if(s!=x.s) return s<x.s;
        else if(lch!=x.lch) return lch < x.lch;
        else return rch < x.rch;
    }
};

map<tree,int> MAP;
map<int,tree> NODE;
int vis[maxn];
string s;

int cnt = 0;
int k = 0;

int solve()
{
    string cur;
    while(s[k] >= ‘a‘ && s[k] <= ‘z‘) cur.push_back(s[k++]);
    int id = ++cnt;
    tree &t = NODE[id];
    t.lch = 0;
    t.rch = 0;
    t.s = cur;

    if(s[k] == ‘(‘){
        k++;
        t.lch = solve(); k++;
        t.rch = solve(); k++;
    }

    if(MAP[t]){
        cnt--;
        return MAP[t];
    }
    else return MAP[t] = id;
}

void print(int u)
{
    if(vis[u]){
        cout<<u;
    }
    else{
        vis[u] = 1;
        cout<<NODE[u].s;
        if(NODE[u].lch){
            cout<<‘(‘;
            print(NODE[u].lch);
            cout<<‘,‘;
            print(NODE[u].rch);
            cout<<‘)‘;
        }
    }
}

int main()
{
    int n;
    cin>>n;
    while(n--){
        MAP.clear();
        NODE.clear();
        CLR(vis,0);
        k = 0, cnt = 0;

        cin>>s;
        solve();
        print(1);
        cout<<endl;
    }
    return 0;
}

 

公共表达式消除 uva 12219

标签:struct   cout   tree   cstring   cin   include   void   cst   编号   

原文地址:https://www.cnblogs.com/Tokisaki-Kurumi-/p/8763214.html

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