3500N - DAG优化(编译原理)

Posted 0xiaoyu

tags:

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

Description

大家都学过了代码优化,其中有一个DAG优化,这次我们就练习这个操作。

Input

输入第一行为一个整数n(n < 100),表示该组输入的表达式的个数

之后n行为表达式,每个变量为一个字母,表达式仅包括二元运算 + - * /

例如:A=B+C

Output

 通过构造DAG图,进行代码优化,只需要保留AB,删除无用变量,删除变量时,尽量保留最早出现的变量。

PS:保证AB的值不同

Sample

Input 

3
A=B+C
B=B+B
A=C+C

Output 

B=B+B
A=C+C
  1 #include <iostream>
  2 #include <vector>
  3 #include <string.h>
  4 
  5 using namespace std;
  6 
  7 struct Node
  8 {
  9     char id;
 10     int left=-1, right=-1;
 11     vector<char> ve;
 12 }node[105];
 13 
 14 char s[15], re[105][15];
 15 int book[105], n, top;
 16 
 17 int fin(int cur, char ch)
 18 {
 19     int len = node[cur].ve.size();
 20     for(int i=0; i<len; i++)
 21     {
 22         if(node[cur].ve[i]==ch) return 1;
 23     }
 24     return 0;
 25 }
 26 
 27 int add_node(char ch)
 28 {
 29     for(int i=0; i<top; i++)
 30     {
 31         if(node[i].id==ch || fin(i, ch)) return i;
 32     }
 33     node[top++].id = ch;
 34     return top-1;
 35 }
 36 
 37 void add_op(char res, char op, int l, int r)
 38 {
 39     for(int i=0; i<top; i++)
 40     {
 41         if(node[i].id==op && node[i].left==l && node[i].right==r)
 42         {
 43             node[i].ve.push_back(res);
 44             return;
 45         }
 46     }
 47     node[top].id = op;
 48     node[top].left = l;
 49     node[top].right = r;
 50     node[top].ve.push_back(res);
 51     top++;
 52 }
 53 
 54 char exist(int cur)
 55 {
 56     char re = node[cur].ve[0];
 57     int len = node[cur].ve.size();
 58     for(int i=0; i<len; i++)
 59     {
 60         if(node[cur].ve[i] == A || node[cur].ve[i] == B) re = node[cur].ve[i];
 61     }
 62     return re;
 63 }
 64 
 65 void dfs(int x)
 66 {
 67     if(node[x].left != -1)
 68     {
 69         book[x] = 1;
 70         dfs(node[x].left);
 71         dfs(node[x].right);
 72     }
 73 }
 74 
 75 int main()
 76 {
 77     int l, r;
 78     cin >> n;
 79     top = 0;
 80     memset(book, 0, sizeof(book));
 81     for(int i=0; i<n; i++)
 82     {
 83         cin >> s;
 84         l = add_node(s[2]);
 85         r = add_node(s[4]);
 86         add_op(s[0], s[3], l, r);
 87     }
 88 //    for(int i=0;i<top;i++)
 89 //    {
 90 //        cout << node[i].id << " " << node[i].left <<  " " << node[i].right << " ";
 91 //        for(char c : node[i].ve)
 92 //        {
 93 //            cout << c;
 94 //        }
 95 //        cout << endl;
 96 //    }
 97     for(int i=0; i<top; i++)
 98     {
 99         if(node[i].left != -1) ///式子
100         {
101             re[i][0] = exist(i);
102             re[i][1] = =;
103             Node ll = node[node[i].left];
104             Node rr = node[node[i].right];
105             re[i][2] = ll.ve.size()>0 ? exist(node[i].left) : ll.id;
106             re[i][3] = node[i].id;
107             re[i][4] = rr.ve.size()>0 ? exist(node[i].right) : rr.id;
108             re[i][5] = 0;
109         }
110     }
111     for(int i=top-1; i>=0; i--)
112     {
113         if(re[i][0] == A)
114         {
115             dfs(i);
116             break;
117         }
118     }
119     for(int i=top-1; i>=0; i--)
120     {
121         if(re[i][0] == B)
122         {
123             dfs(i);
124             break;
125         }
126     }
127     for(int i=0; i<top; i++)
128     {
129         if(book[i]) cout << re[i] << endl;
130     }
131     return 0;
132 }

 

以上是关于3500N - DAG优化(编译原理)的主要内容,如果未能解决你的问题,请参考以下文章

编译原理学习笔记代码优化

spark是不是优化了pyspark中相同但独立的DAG?

编译原理学了有啥用?

Perf的原理编译以及使用

Perf的原理编译以及使用

编译原理的看法