uva-12219

Posted kayiko

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva-12219相关的知识,希望对你有一定的参考价值。

https://vjudge.net/problem/UVA-12219

思路:把每一个子树用一个数代替放到map里,这样查一棵子树是否出现就是快多了。递归打印答案即可。

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int mod =1e6+7;
double esp=1e-6;
int INF =0x3f3f3f3f;
const int inf = 1<<28;
const int MAXN=60000;
char s[MAXN*5],*p;
int T,n,m,cnt,kase;
struct node
{
    string s;
    int hash,l,r;
    bool operator <(const node&p)const//map比较的条件
    {
        if(hash!=p.hash)return hash<p.hash;
        if(l!=p.l)return l<p.l;
        return r<p.r;
    }
}nodes[MAXN];
map<node,int> mp;
int solve()
{
    int id=cnt++;
    node& u=nodes[id];
    u.l=u.r=-1;
    u.s="";
    u.hash=0;
    while(isalpha(*p))
    {
        u.hash=u.hash*27+*p-a+1;
        u.s+=*p;
        ++p;
    }
    if(p&&(*p)==()
    {
        p++;
        u.l=solve();
        p++;
        u.r=solve();
        p++;
    }
    if(mp.count(u))//如果map里有,就直接返回这个子树的id
    {
        cnt--;
        return mp[u];
    }
    return mp[u]=id;
}
int ex[MAXN];
void print(int v)//递归打印
{
    if(ex[v]!=kase)
    {
        ex[v]=kase;
        cout<<nodes[v].s;
        if(nodes[v].l!=-1)
        {
            printf("(");
            print(nodes[v].l);
            printf(",");
            print(nodes[v].r);
            printf(")");
        }
    }
    else
    {
        printf("%d",v);
    }
}
int main()
{
    scanf("%d",&T);
    for(kase=1;kase<=T;kase++)
    {
        mp.clear();
        scanf("%s",s);
        p=s;
        cnt=1;
        int tmp=solve();
        print(tmp);
        printf("
");
    }
    return 0;
}

 

以上是关于uva-12219的主要内容,如果未能解决你的问题,请参考以下文章

uva 12219 公共表达式消除

uva-12219

UVA12219

UVa12219 Common Subexpression Elimination (表达式树)

UVa 12219 - Common Subexpression Elimination

表达式树(公共表达式消除 uva 12219)