51nod 1832 先序遍历与后序遍历【二叉树+高精度】
两棵二叉树不同当且仅当对于某个x,x的左儿子编号不同或x的右儿子编号不同。
第一行一个正整数n(3<=n<=10000),表示二叉树的节点数,节点从1到n标号。
第二行n个整数a[i](1<=a[i]<=n),表示二叉树的先序遍历。
第三行n个整数b[i](1<=b[i]<=n),表示二叉树的后序遍历。
输出一个整数表示有多少种方案。保证至少有1种方案。
3
1 2 3
2 3 1
1 题解:找出只有一个儿子的节点数,则这种节点的儿子可以放在左子树或右子树即两种选择,然后将每种情况相乘即可,结果太大,再抄个高精度的板子嘛。
//yy:唉,我都快不记得怎么敲二叉树了。。类似的还可以拓展到n叉树,都是一类已知先序遍历和后序遍历求可构造树的方案数。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long ll;
const int N = ;
struct BigInt
{
const static int mod = ;
const static int DLEN = ;
int a[],len;
BigInt()
{
memset(a,,sizeof(a));
len = ;
}
BigInt(int v)
{
memset(a,,sizeof(a));
len = ;
do
{
a[len++] = v%mod;
v /= mod;
}while(v);
}
BigInt(const char s[])
{
memset(a,,sizeof(a));
int L = strlen(s);
len = L/DLEN;
if(L%DLEN) len++;
int index = ;
for(int i = L-;i >= ;i -= DLEN)
{
int t = ;
int k = i - DLEN + ;
if(k < ) k = ;
for(int j = k;j <= i;j++)
t = t* + s[j] - '';
a[index++] = t;
}
}
BigInt operator +(const BigInt &b)const
{
BigInt res;
res.len = max(len,b.len);
for(int i = ;i <= res.len;i++)
res.a[i] = ;
for(int i = ;i < res.len;i++)
{
res.a[i] += ((i < len)?a[i]:)+((i < b.len)?b.a[i]:);
res.a[i+] += res.a[i]/mod;
res.a[i] %= mod;
}
if(res.a[res.len] > ) res.len++;
return res;
}
BigInt operator *(const BigInt &b)const
{
BigInt res;
for(int i = ; i < len; i++)
{
int up = ;
for(int j = ;j < b.len;j++)
{
int temp = a[i] * b.a[j] + res.a[i+j] + up;
res.a[i+j] = temp%mod;
up = temp/mod;
}
if(up != )
res.a[i + b.len] = up;
}
res.len = len + b.len;
while(res.a[res.len - ] == &&res.len > )
res.len--;
return res;
}
void output()
{
printf("%d",a[len-]);
for(int i = len-;i >= ;i--)
printf("%04d",a[i]);
printf("\n");
}
};
BigInt ans();
int pre[N], post[N];
int n;
void dfs(int l1, int r1, int l2, int r2) {
if(l1 > r1) return;
if(r1 - l1 == ) return;
l1++; r2--;
int num = ;
int p = l2;
while(post[p] != pre[l1]) p++;
int r11 = l1 + (p - l2 + ), r22 = p + ;
num++;
dfs(l1, r11, l2, r22);
if((r1-l1)-(p-l2+)!=) {
num++; dfs(r11, r1, p+, r2);
}
num = num == ? : ;
ans = ans * BigInt(num);
}
int main() {
int i, j;
scanf("%d", &n);
for(i = ; i < n; ++i) scanf("%d", &pre[i]);
for(i = ; i < n; ++i) scanf("%d", &post[i]);
dfs(,n,,n);
ans.output();
return ;
}
46ms
51nod 1832 先序遍历与后序遍历【二叉树+高精度】的更多相关文章
- 51Nod 算法马拉松28 A题 先序遍历与后序遍历 分治
		
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - 51Nod1832 题意概括 对于给定的一个二叉树的先序遍历和后序遍历,输出有多少种满足条件的二叉树. 两棵二 ...
 - lintcode: 中序遍历和后序遍历树构造二叉树
		
题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 / \ 1 3 注意 你可 ...
 - java编写二叉树以及前序遍历、中序遍历和后序遍历 .
		
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
 - python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)
		
python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...
 - 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)
		
好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...
 - TZOJ 3209 后序遍历(已知中序前序求后序)
		
描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义: ...
 - javascript数据结构与算法--二叉树遍历(后序)
		
javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...
 - LintCode2016年8月8日算法比赛----中序遍历和后序遍历构造二叉树
		
中序遍历和后序遍历构造二叉树 题目描述 根据中序遍历和后序遍历构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下 ...
 - 数据结构实习 - problem K 用前序中序建立二叉树并以层序遍历和后序遍历输出
		
用前序中序建立二叉树并以层序遍历和后序遍历输出 writer:pprp 实现过程主要是通过递归,进行分解得到结果 代码如下: #include <iostream> #include &l ...
 
随机推荐
- h5移动端设置键盘搜索
			
点击键盘上的搜索按钮实现页面跳转 <form action="#list?goods_title={{message?message:''}}" @submit.preven ...
 - Change - Why we need coding standards
			
Change - Why we need coding standards I have the idea of coding standards when I have to review my t ...
 - sql 递归  STUFF
			
select distinct fm_id, ,,'') AS SO_Nums from [dbo].[t_BADItems] its 表内一对多 的关系查询
 - gradle 构建的 Spring Boot  使用 logback
			
文章讲的是配置和使用,入门请看文档先. what 目的: 可以实现log不同级别的日志记录,例如info 在一个文件夹内,另一个级别的在另一个文件夹内. how 配置依赖项 //log ...
 - 十二 Cent OS下 tomcat启动项目响应速度很慢
			
在tomcat部署了web项目,每次启动项目都需要花费2-3分钟,甚至有的时候需要花费10分钟左右,实在是太慢了. 在网上查找解决方案,把 jdk/jre/lib/security/java.secu ...
 - UrlRewrite 的配置和使用总结
			
UrlRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址. 主要优点 一:提高安全性,可以有效的避免一些参数名.ID等完全暴露在用户面前,如果用户随便乱输的话,不 ...
 - Java finally关键字
			
关于finally语句块,有如下特点: 1.finally语句块可以直接和try语句块联用.try...finally... 2.try...catch...finally也可以 3.通常在final ...
 - Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))
			
在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...
 - 深入理解jQuery插件开发总结(二)
			
1,开始 可以通过为jQuery.fn增加一个新的函数来编写jQuery插件.属性的名字就是你的插件的名字: jQuery.fn.myPlugin = function(){ //开始写你的代码吧! ...
 - Grunt插件uglify
			
Gruntfile.js里面配置: module.exports = function(grunt){ // 项目配置 grunt.initConfig({ pkg: grunt.file.readJ ...