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优化(编译原理)的主要内容,如果未能解决你的问题,请参考以下文章