九度OJ 1044:Pre-Post(先序后序) (n叉树、递归)
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:701
解决:398
- 题目描述:
-
We are all familiar with pre-order, in-order and post-order traversals of binary trees. A common problem in data structure classes is to find the pre-order traversal of a binary tree when given the in-order and post-order traversals. Alternatively,
you can find the post-order traversal when given the in-order and pre-order. However, in general you cannot determine the in-order traversal of a tree when given its pre-order and post-order traversals. Consider the four binary trees below:
All of these trees have the same pre-order and post-order traversals. This phenomenon is not restricted to binary trees, but holds for general m-ary trees as well.
- 输入:
-
Input will consist of multiple problem instances. Each instance will consist of a line of the form
m s1 s2
indicating that the trees are m-ary trees, s1 is the pre-order traversal and s2 is the post-order traversal.All traversal strings will consist of lowercase alphabetic characters. For all input instances, 1 <= m <= 20 and the length of s1 and s2 will
be between 1 and 26 inclusive. If the length of s1 is k (which is the same as the length of s2, of course), the first k letters of the alphabet will be used in the strings. An input line of 0 will terminate the input.
- 输出:
-
For each problem instance, you should output one line containing the number of possible trees which would result in the pre-order and post-order traversals for the instance. All output values will be within the range of
a 32-bit signed integer. For each problem instance, you are guaranteed that there is at least one tree with the given pre-order and post-order traversals.
- 样例输入:
-
2 abc cba
2 abc bca
10 abc bca
13 abejkcfghid jkebfghicda
- 样例输出:
-
4
1
45
207352860
思路:
求对于m叉树而言其每层的叶子节点的组合方式有多少种。
由先序和后序序列其实可以却确定每一层的叶子节点的个数,以及哪些是这一层的叶子节点,唯一不确定的就是这些节点的位置(但是由先序可以确定这些叶子节点相对位置是确定的),比如第i层有n个叶子节点(由先序和后序结合判定出),那么这层就有c(n,m)种组合方式,然后确定某个叶子节点的子树,对其进行递归求解。
代码:
#include <stdio.h>
#include <string.h> #define M 20
#define N 26 int m; long long C(int m, int k)
{
int i;
long long c = 1;
for (i=m; i>k; i--)
c *= i;
for (i=m-k; i>0; i--)
c /= i;
return c;
} long long prepost(char s1[], char s2[])
{
int len = strlen(s1);
if (len == 0 || len == 1)
return 1; char root;
int c;
char sch1[M][N+1], sch2[M][N+1];
int i, j, k;
c = 0;
i = 1;
while (i < len)
{
root = s1[i];
j = i-1;
k = 0;
do
{
sch1[c][k] = s1[i];
sch2[c][k] = s2[j];
k++;
i++;
} while (s2[j++] != root);
sch1[c][k] = '\0';
sch2[c][k] = '\0';
c++;
} long long count = C(m, c);
for (i=0; i<c; i++)
count *= prepost(sch1[i], sch2[i]);
return count;
} int main(void)
{
char s1[N+1], s2[N+1]; while (scanf("%d", &m) != EOF)
{
scanf("%s%s", s1, s2);
//printf("%lld\n", C(6, 2));
printf("%lld\n", prepost(s1, s2));
} return 0;
}
/**************************************************************
Problem: 1044
User: liangrx06
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/
九度OJ 1044:Pre-Post(先序后序) (n叉树、递归)的更多相关文章
- 九度OJ 1360:乐透之猜数游戏 (递归)
时间限制:2 秒 内存限制:32 兆 特殊判题:否 提交:955 解决:261 题目描述: 六一儿童节到了,YZ买了很多丰厚的礼品,准备奖励给JOBDU里辛劳的员工.为了增添一点趣味性,他还准备了一些 ...
- 九度OJ 1358:陈博的平均主义 (遍历、递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:354 解决:191 题目描述: 在JOBDU团队里,陈博是最讲平均主义的人了,但并不是像梁山好汉那样能够做到有钱同花,有肉同吃,毕竟,他还是 ...
- 九度OJ 1146:Flipping Pancake(翻饼子) (递归、游戏)
时间限制:1 秒 内存限制:32 兆 特殊判题:是 提交:265 解决:116 题目描述: We start with a stack n of pancakes of distinct sizes. ...
- 九度OJ 1124:Digital Roots(数根) (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2963 解决:1066 题目描述: The digital root of a positive integer is found by s ...
- 【九度OJ】题目1201:二叉排序树 解题报告
[九度OJ]题目1201:二叉排序树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1201 题目描述: 输入一系列整数,建立二叉排序 ...
- 【九度OJ】题目1078:二叉树遍历 解题报告
[九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ...
- 【九度OJ】题目1065:输出梯形 解题报告
[九度OJ]题目1065:输出梯形 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1065 题目描述: 每组测试 ...
- 【九度OJ】题目1061:成绩排序 解题报告
[九度OJ]题目1061:成绩排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1061 题目描述: 有N个学 ...
- 【九度OJ】题目1118:数制转换 解题报告
[九度OJ]题目1118:数制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1118 题目描述: 求任意两个不同进制非 ...
随机推荐
- 【WEB基础】HTML & CSS 基础入门(8)表单
前面 前面我们已经熟悉了网页上一些常见的元素,如在网页上显示一段文字.一张图片.一个列表.一张表格等等.这些东西都是事先编辑好显示在页面上只提供给用户看的,实际上,我们可以把这样的页面称之为静态页面. ...
- Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)
Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一) 在Xamarin.Forms中,提供了两个控件用来指示程序的状态和进度.他们分别为活动指示器和进度条.其中,活动指示器 ...
- ubuntu归档管理器消失了?
Ubuntu - gnome 下的归档管理器软件名称: file-roller如果没有看看是不是这个包让你删除掉了?用这个命令查: dpkg -l | grep file-roller 如果有这 ...
- python list删除数据 和复制 列表
复制列表的方法: lst = [1,2,3] lst1 = lst[:] # one way lst2 = list(lst) # another 删除数据的正确方法: num_list = [1, ...
- mac 安装 mysql-python
1 首先安装mysql 要那种纯净,独立的mysql,不是xampp里附带的 2 下载 mysql-python压缩包,解压,找到里面的site.cfg里的 mysql_config = /usr/l ...
- 15.【nuxt起步】-Nuxt使用jsweixin sdk
npm install weixin-js-sdk --save 这个不行,这个是vue前端用的 网上找了一些vue jsweixin的案例 不能直接用 因为nuxt是后端运行,windows对象取不 ...
- ubuntu更改mysql的编码配置
1.Ctrl+t打开终端 2.输入mysql -u root -p 命令,进入MySQL 输入 SHOW VARIABLES LIKE 'char%'; 查看MySQL编码,有两个不是utf8 3.在 ...
- 2016年蓝桥杯C/C++B组
第一次參加蓝桥杯.也是有非常多感触的,时间全然不够写最后一题... 最后一题没做...还有全排序非常重要... 1. 煤球数目 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三 ...
- java命令行
Launches a Java application. Synopsis java [options] classname [args] java [options] -jar filename [ ...
- codeforces 283C
给 n 中 钱币.以及每两种钱币的关系,表示,ai 的 个数 要大于 bi 组合成一个价值val,求方案数,好奇妙的一个处理方式,不得不说又学到了 #include<stdio.h> #i ...