O - DAG优化
#include<bits/stdc++.h> using namespace std; struct Node{ char ch;//下 vector<char> val;//右 int left=-1,right=-1;//子节点 }tree[200]; int m=0; bool flag[200]; string ans[200]; bool finds(int x,char ch){ for(char k:tree[x].val){ if(k==ch) return true; } return false; } int build(char ch){ for(int i=0;i<m;i++){ if(tree[i].ch==ch || finds(i,ch)) return i; } tree[m].ch=ch; return m++; } void build_op(char k,char op,int l,int r){ for(int i=0;i<m;i++){ Node x=tree[i]; if(x.ch==op && x.left==l && x.right==r) { tree[i].val.push_back(k); return; } } //这里写外面 tree[m].ch=op; tree[m].val.push_back(k); tree[m].left=l; tree[m].right=r; m++; } char gets(int x){ Node k=tree[x]; if(k.val.size()==0) return k.ch; for(char t:k.val){ if(t=='A'|| t=='B') return t;//优先选a/b的 } return k.val[0]; } void dfs(int x){ if(tree[x].left!=-1 && tree[x].right!=-1){ flag[x]=true; dfs(tree[x].left); dfs(tree[x].right); } } void get_ans(char k){ for(int i=m-1;i>=0;i--){ if(ans[i][0]==k) { dfs(i); return; } } } int main(){ int t;cin>>t; for(int i=0;i<t;i++){ string s;cin>>s; int l=build(s[2]),r=build(s[4]); build_op(s[0],s[3],l,r); } for(int i=0;i<m;i++){ Node x=tree[i]; if(x.left!=-1 && x.right!=-1) { ans[i].push_back(gets(i)); ans[i].push_back('='); ans[i].push_back(gets(x.left)); ans[i].push_back(x.ch); ans[i].push_back(gets(x.right)); } } get_ans('A'),get_ans('B'); for(int i=0;i<m;i++){ if(flag[i]) cout<<ans[i]<<endl; } }
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/17430901.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-05-25 7-2 sdut-字符之比较大小
2022-05-25 7-19 sdut-最大公约数和最小公倍数
2022-05-25 7-14 sdut-平方数(I)
2022-05-25 7-13 sdut-九九乘法表
2022-05-25 JAVA_Web JSTL_Core标签库使用
2022-05-25 Idea导入