upcoj2679 Binary Tree(思路题)

题意:

给你两个串,每个串有LRU三个操作,L(R)为去左(右)子树,U为回到父亲(根节点不作处理)

然后按这样的规则遍历完第一个串,将现在的位置作为第二个串的起始位置

然后遍历第二个串,第二个串的每个位置都可以执行或者不执行,U操作为将原点倒退(按第一个串行进的过程反向)

问你最多能到多少个节点 ?

思路:

开一个栈将第一个串的每一步的变动压入栈中,第二个串遍历的时候开三个变量l,r,sum

lr分别表示向左(右)走的新节点数量,这样遍历第二个串的时候,

遇到L就让ans和r都加l,意思不好讲啊,就是当前向左走的话就开辟了向右走的新节点。。

遇到R同样,让ans和l都加r

最后就是遇到U的时候,如果第一个串的顶端是L的话表明他是从父亲节点向左走得到的当前的起点

然后U上去就开辟了一个向右走的新节点。。所以ans和r都加1,R的情况同理ans和l都加1

大概就是这样,还是画出图来比较好看,附上我的渣渣代码

/* ***********************************************
Author        :devil
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
#define inf 0x3f3f3f3f
#define LL long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dec(i,a,b) for(int i=a;i>=b;i--)
#define ou(a) printf("%d\n",a)
#define pb push_back
#define mkp make_pair
template<class T>inline void rd(T &x){char c=getchar();x=0;while(!isdigit(c))c=getchar();while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}}
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
using namespace std;
const int mod=21092013;
const int N=1e5+10;
int t;
char s1[N],s2[N];
int main()
{
    rd(t);
    rep(y,1,t)
    {
        scanf("%s%s",s1,s2);
        stack<char>q;
        int len=strlen(s1);
        rep(i,0,len-1)
        {
            if(s1[i]==‘U‘) {if(!q.empty()) q.pop();}
            else q.push(s1[i]);
        }
        int l=1,r=1,ans=1;
        len=strlen(s2);
        rep(i,0,len-1)
        {
            if(s2[i]==‘U‘&&!q.empty())
            {
                char p=q.top();
                q.pop();
                ans++;
                if(p==‘L‘) r++;
                else l++;
            }
            else if(s2[i]==‘L‘)
            {
                (ans+=l)%=mod;
                (r+=l)%=mod;
            }
            else if(s2[i]==‘R‘)
            {
                (ans+=r)%=mod;
                (l+=r)%=mod;
            }
        }
        printf("Case %d: %d\n",y,ans%mod);
    }
    return 0;
}
时间: 2024-12-19 15:08:42

upcoj2679 Binary Tree(思路题)的相关文章

binary tree/tree相关问题 review

本文主要对binary tree和tree相关问题做一个review,然后一道一道解决leetcode中的相关问题. 因为是review了,所以基本概念定义什么的就不赘述.review主要包括:inorder, postorder,preorder traversal的iterative version,(recursive比较直接,先不多解释了),level order traversal以及morris traversal. 首先定义一下binary tree,这里我们follow leet

LeetCode:Minimum Depth of Binary Tree

要求:此题正好和Maximum Depth of Binary Tree一题是相反的,即寻找二叉树的最小的深度值:从根节点到最近的叶子节点的距离. 结题思路:和找最大距离不同之处在于:找最小距离要注意(l<r)? l+1:r+1的区别应用,因为可能存在左右子树为空的情况,此时值就为0,但显然值是不为0的(只有当二叉树为空才为0),所以,在这里注意一下即可! 代码如下: 1 struct TreeNode { 2 int val; 3 TreeNode *left; 4 TreeNode *rig

leetcode笔记:Maximum Depth of Binary Tree

一. 题目描述 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 二. 题目分析 这道题和Minimum Depth of Binary Tree一题相似,这个是求最大深度的,就是对二叉树进行递归,然后将子树的最大深度进行返回,最

Binary Tree Right Side View

问题: Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom. For example:Given the following binary tree, 思路: bfs+dfs 我的代码: public class Solution { public List<Inte

【树】Construct Binary Tree from Preorder and Inorder Traversal

题目: Given preorder and inorder traversal of a tree, construct the binary tree. 思路: 线序序列的第一个元素就是树根,然后在中序序列中找到这个元素(由于题目保证没有相同的元素,因此可以唯一找到),中序序列中这个元素的左边就是左子树的中序,右边就是右子树的中序,然后根据刚才中序序列中左右子树的元素个数可以在后序序列中找到左右子树的后序序列,然后递归的求解即可 /** * Definition for a binary t

Sicily 1156. Binary tree

题目地址:1156. Binary tree 思路: 如何愉快地前序输出呢,要在存储数据的时候根据位置来存放数据! 一开始被自己蠢哭,一直以为第一个输入的就是根结点(例子的祸害呀啊啊啊!!!!),结果证明不是的,所以呢,我们要找出根结点,那么怎么找根结点呢,我用了一个向量来存储下标值,遍历向量值,把节点的左右值作为下标的那个数据设为非根结点,然后剩下的那个就是根节点了. 具体代码如下: 1 #include <iostream> 2 #include <vector> 3 usin

leetCode 104.Maximum Depth of Binary Tree(二叉树最大深度) 解题思路和方法

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 思路:很基础的一个题,DFS即可.代码如下: /** * Definition for a binary tree node. * public class TreeNode {

leetCode 94.Binary Tree Inorder Traversal(二叉树中序遍历) 解题思路和方法

Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? confused what "{1,#,2,3}" means? > rea

Leetcode刷题记录[python]——104 Maximum Depth of Binary Tree

一.前言 对于这类抽象问题还有self用法,还要多做多练习,此题是参考其他答案所做. 二.题104 Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. # Definitio