pku acm 1095

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)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章