1029 遍历问题

1029 遍历问题

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 钻石 Diamond

题解

查看运行结果

题目描述 Description

我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:

所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。

输入描述 Input Description

输入文件共2行,第一行表示该树的前序遍历结果,第二行表示该树的后序遍历结果。输入的字符集合为{a-z},长度不超过26。

输出描述 Output Description

输出文件只包含一个不超过长整型的整数,表示可能的中序遍历序列的总数。

样例输入 Sample Input

abc

cba

样例输出 Sample Output

4

数据范围及提示 Data Size & Hint

如描述

分类标签 Tags 点此展开

动态规划 深度优先搜索 递归 搜索

/*
如果直接求个数,你可以先建立一棵树,然后寻找即可。
但是这个方法复杂度高,空间高,编程长度长。所以不建议使用这种方法
对于树的基础概念感觉很多不理解,先序就是先遍历根,接着左边,最后右边,中序中间遍历根,后序最后遍历根
这两个中一定有子序列是相同的
a[i+1]==b[j-1]如果这个成立,相当于有构造一个新的子树,会使总方案翻倍(这个话说自己也没弄清)
答案就是成立的 2^ans
*/
#include<cstdio>
#include<cstring>
using namespace std;
char qian[30],hou[30];
int ans;
int main(){
    scanf("%s%s",qian,hou);
    for(int i=0;i<strlen(qian);i++)
        for(int j=1;j<strlen(hou);j++)
            if(qian[i]==hou[j]&&qian[i+1]==hou[j-1])
                ans++;
    printf("%d\n",1<<ans);//其实还可以用快速幂优化一下,~~
    return 0;
}
时间: 2024-10-09 21:07:31

1029 遍历问题的相关文章

二叉树结构 codevs 1029 遍历问题

codevs 1029 遍历问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 我们都很熟悉二叉树的前序.中序.后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历.然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树: 所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同.

code vs 1029 遍历问题 区间dp

http://codevs.cn/problem/1029/ 给出一棵二叉树(节点是小写字符)的按照先序遍历和后续遍历得到的字符串,其实就是求有多少和二叉树的先序遍历和后序遍历满足这两个字符串.区间dp:dp(l, r, a, b)表示s字符串的(l, r)段和t字符串的(a, b)段相匹配的方案数.那么s[l]和t[b]必须一样,因为这两个是这一段的根节点.然后我们再枚举(l,r)的左子树(l+1,k)和(a,b)的左子树(a,a+k-l-1);dp(l,r,a,b) = sum(dp(l+1

Codevs 1029(遍历问题 )

题目链接:传送门 题目大意:根据题目给你的二叉树先序遍历,后序遍历,输出有多少种二叉树满足这两种遍历方式. 题目思路: 首先我们要知道 先序遍历 是先遍历当前节点,然后遍历左子树,最后遍历右子树     中序遍历 是先遍历节点的左子树,然后是当前节点,最后遍历右子树   后序遍历 是先遍历左子树,再遍历右子树,最后遍历当前节点 先序输出: A B D G H E C K F I J 中序输出: G D H B E A K C I J F 后序输出: G H D E B K J I F C A 然

遍历问题 codevs

1029 遍历问题 1029 遍历问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 我们都很熟悉二叉树的前序.中序.后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历.然而给定一棵二叉树的前序和后序,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树: 所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不

小结:动态规划

概要: 状态.转移:最优子结构.无后效性. 技巧及注意: dp就是纯经验+智商题 在dp方程写出来后,一定要考虑边界!不要以为转移对了就行了! 滚动数组的话一定要考虑好顺序! 下标有时候可以灵活使用!比如mod意义下的dp,倍数什么.可到达性等题目都可以这样做. 如果是线性序列的max{f[k]},k<i这种可以用线段树或bit维护成log 注意“前i”和“第i”的区别(特别对于答案更新),有时换一种就能解答出问题. 在状态加限制条件,如单调.地址等. 用下标来维护下标这个答案是否可达. 博弈论

wikioi 1029 中序遍历总数

题意:给出前序遍历和后序遍历,求总共有多少种中序遍历的可能. 思路: 对于一个节点,当且仅当它仅有一棵子树时,在保证先序和后序相同的前提下,才可能有不同的中序(它的子树可在左或右,所以有2种): 此时必有a[i+1]==b[j-1](为什么)//i是节点在先序中的位置,j是它在后序中的位置: 因此只要找到这种节点的个数设为x,ans=2^x. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iost

HDU 1029 Ignatius and the Princess IV --- 水题

HDU 1029 题目大意:给定数字n(n <= 999999 且n为奇数 )以及n个数,找出至少出现(n+1)/2次的数 解题思路:n个数遍历过去,可以用一个map(也可以用数组)记录每个数出现的次数, 若次数一旦达到(n+1)/2,即输出a[i] 注意能出现(n+1)/2次数的最多只有一个 /* HDU 1029 *Ignatius and the Princess IV --- dp */ #include <cstdio> #include <cstring> #in

[Wikioi 2913][BZOJ 1029][JSOI 2007]建筑抢修

题目描述 Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏: 经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏.现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间.同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑.如果某个建筑在一段时间之内没有完全修理完毕,这个建筑就报废了.你的

PAT Basic 1029

1029 旧键盘 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出肯定坏掉的那些键. 输入格式: 输入在2行中分别给出应该输入的文字.以及实际被输入的文字.每段文字是不超过80个字符的串,由字母A-Z(包括大.小写).数字0-9.以及下划线"_"(代表空格)组成.题目保证2个字符串均非空. 输出格式: 按照发现顺序,在一行中输出坏掉的键.其中英文字母只输出大写,每个坏键只输出一次.题目保证至少有1个坏键. 输入