Common Subexpression Elimination UVA

来源:互联网 发布:kbengine java 编辑:程序博客网 时间:2024/06/11 09:38

图论的一道简单的题目,在进行实现的时候既要记录每个节点的信息,包括该节点所指向的右子树的节点同时也包括左子树的节点位置,以及当前节点当中所包含的字符的信息,同时利用一个Map来进行查询以及去重,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>using namespace std;string express;class Node{public:int hash, left, right;string s;bool operator< (const Node a) const{if (hash != a.hash) return hash < a.hash;else if (left != a.left) return left < a.left;return right < a.right;}};Node node[50005];map<Node, int> dict;class Solve{public:int amount;int finish[50005];int cur;int parse(int& ind){int id;id = amount++;Node& temp=node[id];temp.left = temp.right = -1;temp.hash = 0;temp.s = "";while (ind < express.size() && isalpha(express[ind])){temp.hash = temp.hash * 27 + express[ind] - 'a' + 1;temp.s += express[ind];ind++;}if (express[ind] == '('){ind++;temp.left = parse(ind);ind++;temp.right = parse(ind);ind++;}if (dict.count(temp) != 0){id--;amount--;return dict[temp];}return dict[temp] = id;}void Print(int ind){if (finish[ind] == cur){cout << ind + 1;}else{finish[ind] = cur;cout << node[ind].s;if (node[ind].left != -1){cout << "(";Print(node[ind].left);cout << ",";Print(node[ind].right);cout << ")";}}}void Deal(){cur++;amount = 0;int ind = 0;int res=parse(ind);Print(res);cout << endl;}};int  main(){int c;cin >> c;Solve a;a.cur = 0;memset(a.finish,0,sizeof(a.finish));while (c--){dict.clear();cin >> express;a.Deal();}}

阅读全文
0 0