我们可以唯一的确定二叉树;同样的,如果知道了后根遍历的结果和中根遍历结果,二叉树也是唯一确定
的。但是如果只知道先根遍历和后根遍历的结果,二叉树就不是唯一的了。但是我们可以计算满足条件的
不同二叉树的一共有多少个。这不是一个很困难的问题,稍微复杂一点,我们把这个问题推广到 N 叉树。
我们用小写英文字母来表示 N 叉树的结点,不同的结点用不同的字母表示。比如,对于 4 叉树,如果
先根遍历的结果是 abdefgc,后根遍历的结果是 defgbca,那么我们可以得到 6 个不同的 4 叉树
输入:
输入数据包括 3 行。
第一行是一个正整数 N(1 ≤ N ≤ 20),表示我们要考虑 N 叉树。
第二行和第三行分别是两个字符串序列,分别表示先根遍历和后根遍历的结果。
输出:
输出不同的 N 叉树的数目。题目中给的数据保证得到的结果小于 231。
输入样例:
第一行是一个正整数 N(1 ≤ N ≤ 20),表示我们要考虑 N 叉树。
第二行和第三行分别是两个字符串序列,分别表示先根遍历和后根遍历的结果。
输出:
输出不同的 N 叉树的数目。题目中给的数据保证得到的结果小于 231。
输入样例:
4
abdefgc
defgbca
输出样例:
6
程序:
程序:
#include <bits/stdc++.h>
char str1[100], str2[100];
int N;
long com[100][100];
long getcom(int x, int y) {
if (y == 0 || x == y) 1 ;
else if (com[x][y] != 0) return com[x][y];
else {
com[x][y] = getcom(x - 1, y)+ 2 ;
return com[x][y];
}
}
long count(int a, int b, int c){
long sum = 1;
int k = 0;
int s = a + 1, t = c, p;
if (a == b) return 1;
while(s <= b){
p = t;
while(str1[s] != str2[t]) t++;
sum = sum * count(s, s + t - p, p);
s = 3 ;
4 ;
k++;
}
return 5 * getcom(N, k);
}
int main( ){
int len;
scanf("%d", &N);
scanf("%s%s", str1, str2);
len = strlen(str1);
printf("%ld\n", count( 6 ));
return 0;
}
