我们可以唯一的确定二叉树;同样的,如果知道了后根遍历的结果和中根遍历结果,二叉树也是唯一确定
的。但是如果只知道先根遍历和后根遍历的结果,二叉树就不是唯一的了。但是我们可以计算满足条件的
不同二叉树的一共有多少个。这不是一个很困难的问题,稍微复杂一点,我们把这个问题推广到 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; }