pku acm 1095

来源:互联网 发布:python数据挖掘与实战 编辑:程序博客网 时间:2024/06/15 07:58

Trees Made to Order

#include <iostream>#include <cstdio>#include <string>using namespace std;const int LEN = 30;class OrderTree{private:static int kinds[LEN];//kinds[i]表示有i个结点情况下共有多少种不同的树static int oindex[LEN];//oindex[i]表示有i个结点情况下的起始标记public:static string rTree(int m,int index)//m nodes的第index个{if (m == 0)return "";if (m == 1)return "X";int left,//左子树L含有的结点个数为left;right;//右子树R含有的结点个数为right;int sum = 0;for (left = 0; left < m-1; ++left){if (sum + kinds[left]*kinds[m-left-1] >= index)break;sum += kinds[left]*kinds[m-left-1];}right = m - 1 -left;//右子树个数int i,j;for (i = 1; i <= kinds[left]; ++i){if (sum + kinds[right] >= index)break;sum += kinds[right];}j = index - sum;string sl = rTree(left,i);//左子树为left个结点的第i个string sr = rTree(right,j);//左子树为right个结点的第j个if (sl == "")return "X("+sr+")";if (sr == "")return "("+sl+")X";return "(" + sl + ")X(" +sr+ ")";}static string getResult(int n)//1 <= n <= 500,000,000{int i;for (i = 0;; ++i)//结点个数if (oindex[i] <= n && oindex[i+1] > n)break;int index = n - oindex[i] + 1;return rTree(i,index);//拥有i个结点的第index棵树}static void initKindsOindex(){kinds[0] = 1;kinds[1] = 1;kinds[2] = 2;oindex[0] = 0;oindex[1] = 1;oindex[2] = 2;oindex[3] = 4;//3个结点的起始索引int i,left;for (i = 3; i < LEN; ++i){kinds[i] = 0;for (left = 0; left < i; ++left)kinds[i] += kinds[left]*kinds[i-left-1];oindex[i+1] = oindex[i] + kinds[i];if (oindex[i+1] > 500000000)break;}}static void pKinds(){int i = 0;for (; i < LEN; ++i)cout<<kinds[i]<<" ";cout<<endl;}static void pOindex(){int i = 0;for (; i < LEN; ++i)cout<<oindex[i]<<" ";cout<<endl;}};int OrderTree::kinds[LEN];int OrderTree::oindex[LEN];int main(){freopen("in.txt","r",stdin);OrderTree::initKindsOindex();int n;while (cin>>n){if(n == 0)break;cout<<OrderTree::getResult(n)<<endl;}}

测试用例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
31117532
0


output:

X
X(X)
(X)X
X(X(X))
X((X)X)
(X)X(X)
(X(X))X
((X)X)X
X(X(X(X)))
X(X((X)X))
X((X)X(X))
X((X(X))X)
X(((X)X)X)
(X)X(X(X))
(X)X((X)X)
(X(X))X(X)
((X)X)X(X)
(X(X(X)))X
(X((X)X))X
((X)X(X))X
(X(X(((X(X))X(X))X(X))))X(((X((X)X((X)X)))X)X)