Description
大家都学过了代码优化,其中有一个DAG优化,这次我们就练习这个操作。
N - 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
#include<bits/stdc++.h>
using namespace std;
int via[105];
struct node {
char str;
int l=-1,r=-1;
vector<char> add;
}d[105];
int cnt;
char ans[105][10];
int judge( int id, char str )
{
for ( int i=0; i<d[id].add.size(); i++ ) {
if ( d[id].add[i]==str ) return 1;
}
return 0;
}
int built( char str )
{
for ( int i=0; i<cnt; i++ ) {
if ( d[i].str==str || judge(i,str) ) return i;
}
d[cnt].str = str; ///*--------
return cnt++;
}
void built_add( char x, char op, int l, int r )
{
for ( int i=0; i<cnt; i++ ) {
if ( d[i].str==op && d[i].l==l && d[i].r==r ) {
d[i].add.push_back(x);
return ;
}
}
d[cnt].str = op; //----
d[cnt].l = l;
d[cnt].r = r;
d[cnt].add.push_back(x);
cnt++;
return ;
}
char find_ab( int id )
{
//------
// if ( d[id].str=='A' ||d[id].str=='B' ) return d[id].str;
for ( int i=0; i<d[id].add.size(); i++ ) {
if ( d[id].add[i]=='A' || d[id].add[i]=='B' ) return d[id].add[i];
}
return d[id].add[0];
}
void dfs( int x )
{
if ( d[x].l!=-1 ) {
/------
via[x] = 1;
dfs(d[x].l);
dfs(d[x].r);
}
}
int main()
{
int n;cin>>n;
for ( int i=0; i<n; i++ ) {
string s;cin>>s;
int l = built(s[2]);
int r = built(s[4]);
built_add(s[0],s[3],l,r);
}
for ( int i=0; i<cnt; i++ ) {
if ( d[i].l!=-1 ) {
ans[i][0] = find_ab(i);
ans[i][1] = '=';
node l = d[ d[i].l ];
node r = d[ d[i].r ];
// ----
ans[i][2] = l.add.size()>0?find_ab(d[i].l):l.str;
ans[i][3] = d[i].str;
ans[i][4] = r.add.size()>0?find_ab(d[i].r):r.str;
ans[i][5] = '\0';
}
}
for ( int i=cnt-1; i>=0; i-- ) {
if ( ans[i][0]=='A' ) {
dfs(i);
break;
}
}
for ( int i=cnt-1; i>=0; i-- ) {
if ( ans[i][0]=='B' ) {
dfs(i);
break;
}
}
for ( int i=0; i<cnt; i++ ) {
if ( via[i] ) puts(ans[i]);
}
return 0;
}