题目链接:

http://acm.hust.edu.cn/vjudge/problem/48421

Binary Tree

Time Limit: 3000MS
#### 问题描述
> Binary Tree is a tree data structure where each node has at most two children, usually they are
> distinguished as left and right child. And the node having the children are called parent of those
> children.
> An instruction string is a string consisting of the letters L, R and U. L stands for Left, R for Right
> and U for Up. Meaning of these will be clear shortly.
> One day I have drawn an infinitely large Binary Tree. In this tree each node has exactly two
> children (left child and right child) and each of them has a parent. For this problem, we will consider
> the parent of the root is root itself. I put a pen in the root and follow the instruction string S.
> That is, we look at the first character if it says L we go to left child, if it says R we go to right child
> and if it says U then to the parent. If we receive a U instruction at root we just end up at root since we
> assumed parent of the root is root itself.
> Now we have another instruction string T. Starting from the node where we are after following the
> instruction string S, we will follow the instruction string T. But this time, if we wish we may skip any
> instruction in the string T (possibly discarding all of them). You have to tell me how many different
> nodes I can end up after following instruction string T (skipping as many instructions as I wish).
> For example:
> Suppose: S = L and T = LU. Our answer is 3. Following S we will end up at the left child of the
> root. Now, when we follow T, there may be 4 cases:
> i Skipping all letters: we will be at the same node where we are.
> ii Skipping L and following U: we will be at the root.
> iii Following L and skipping U: we will be at the left child of current node.
> iv Following both L and U: we will be at the same node as in case i.
> Since 3 different nodes we can end up after following T, the answer is 3.

输入

First line of the test file contains an integer N (≤ 20) denoting number of test cases. Hence follow N

test cases. Each test case consists of two non empty strings. First line will contain instruction string S

and the second line will contain the instruction string T. You may assume that there will not be any

letter other than L, R or U in these strings. Length of the strings will not be greater than 100000.

输出

For each test case print the case number followed by the number of nodes we can end up finally. Since

the answer may be large, you have to give the answer modulo 21092013.

样例

sample input

2

L

LU

L

L

sample output

Case 1: 3

Case 2: 2

题解

首先我们考虑只有LR,没有U的情况:

我们定义三个计数变量:ans=1,l=1,r=1;

其中ans为答案,l表示当前局势下,往左走一步能够访问到的新节点;r表示当前局势往右走一步能够访问到的新节点。

如果现在的输入是'L',那么显然会有ans+=l。并且不会影响r,且这些新节点还会创造出更多的能够往右走的新节点:r+=l。

那么,现在我们考虑有'U'的情况:

如果U没有上升到一个没有走过的点,显然是要亏一波的,还不如直接跳过。

因此我们只需要考虑往上走能够走到新节点的情况(用S串来获取信息):

如果父亲在左边(它是右儿子),那么将会有l+=1; ans+=1;

如果父亲在右边:那么有r+=1,ans+=1;

代码

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define pb(v) push_back(v)
#define sz() size()
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++) using namespace std; typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII; const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-8; const int maxn = 1e5+10;
const int mod=21092013; char s1[maxn],s2[maxn];
vector<char> sta; void add_mod(int &x,int y){ x=(x+y)%mod; } void init(){
sta.clear();
} int main() {
int tc,kase=0;
scanf("%d",&tc);
while(tc--){
init();
scanf("%s",s1);
int l1=strlen(s1);
rep(i,0,l1){
if(s1[i]=='U'){
if(sta.size()) sta.pop_back();
}else{
sta.pb(s1[i]);
}
}
scanf("%s",s2);
int l2=strlen(s2);
int l=1,r=1,ans=1;
rep(i,0,l2){
if(s2[i]=='U'){
if(sta.size()){
char last=sta[sta.sz()-1];
sta.pop_back();
if(last=='L'){
add_mod(r,1);
add_mod(ans,1);
}else{
add_mod(l,1);
add_mod(ans,1);
}
}
}else if(s2[i]=='L'){
add_mod(r,l);
add_mod(ans,l);
}else{
add_mod(l,r);
add_mod(ans,r);
}
}
printf("Case %d: %d\n",++kase,ans);
}
return 0;
}

UVALive - 6577 Binary Tree 递推+找规律的更多相关文章

  1. MT【103】二阶递推找规律

    评:如果直接找$a_n$的二阶递推式:$a_{n+2}-2\sqrt{2}a_{n+1}-a_n=0$有根号,不利于估计尾数.

  2. Full Binary Tree(二叉树找规律)

    Description In computer science, a binary tree is a tree data structure in which each node has at mo ...

  3. codeforces 353D 递推 找规律

    题意:一组男生女生在排队,每秒钟所有排在女生左边的男生与她相邻的女生交换位置,求女生全部换到男生前面的时间. 思路: 解法一:队伍最前面的那些女生不需要交换,后面的女生有两种状态:畅通无阻,前一个女生 ...

  4. UVALive 6577 Binary Tree 二叉树的LRU串

    今天继续攒人品...真开心啊O(∩_∩)O~~各种身体不舒服~~ https://icpcarchive.ecs.baylor.edu/external/65/6577.pdf 题意是这样的,现在有一 ...

  5. LA 3357 (递推 找规律) Pinary

    n位不含前导零不含连续1的数共有fib(n)个,fib(n)为斐波那契数列. 所以可以预处理一下fib的前缀和,查找一下第n个数是k位数,然后再递归计算它是第k位数里的多少位. 举个例子,比如说要找第 ...

  6. 51nod 1350 斐波那契表示(递推+找规律)

    传送门 题意 分析 我们发现该数列遵循下列规律: 1 1,2 1,2,2 1,2,2,2,3 1,2,2,2,3,2,3,3 我们令A[i]表示f[i]开始长为f[i-1]的i的最短表示和 那么得到A ...

  7. POJ 2499 Binary Tree(二叉树,找规律)

    题意:给一个这样的二叉树,每个节点用一对数(a,b)表示,根节点为(1,1).设父亲为(a,b),左儿子(a+b,b),右儿子(a,a+b). 给几组数据,(i,j),求从根节点到(i,j)节点需要向 ...

  8. C. Tennis Championship dp递推 || 找规律

    http://codeforces.com/contest/735/problem/C C. Tennis Championship time limit per test 2 seconds mem ...

  9. "红色病毒"问题 HDU 2065 递推+找循环节

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=2065 递推类题目, 可以考虑用数学方法来做, 但是明显也可以有递推思维来理解. 递推的话基本就是状态 ...

随机推荐

  1. POJ C++程序设计 编程题#3 编程作业—多态与虚函数

    编程题 #3 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 下面的程序输出 ...

  2. PL/SQL Developer中文注释乱码的解决办法

    1.检查服务器编码: 执行SQL语法: select * from v$nls_parameters; 2.设置本地客户端编码: 进入 我的电脑,属性,高级,环境变量,添加2项:LANG=zh_CN. ...

  3. 【积硅计划】html标签

    一.基础     在html中,标签通常是由开始标签和结束标签组成,开始标签用<标签名>,结束标签用</标签名>      元素是指包括开始标签和结束标签在内的整体,内容是指出 ...

  4. C++判断对称三位数素数

    题目内容:判断一个数是否为对称三位数素数.所谓“对称”是指一个数,倒过来还是该数.例如,375不是对称数,因为倒过来变成了573. 输入描述:输入数据含有不多于50个的正整数(0<n<23 ...

  5. C# A窗口内容显示在B窗口中的方法

    HeScripts script = new HeScripts(); //A窗口中实例化B窗口 string okscripts = "test"; //设置字段内容 scrip ...

  6. c语言内存分配-malloc

    malloc 原型:(原来返回类型是char) extern void *malloc(unsigned int num_bytes); 头文件: #include <stdlib.h> ...

  7. 5.python的字符串

    在前面提起过字符串这个词,现在就来学习什么是字符串. 首先,字符串是python内置的数据类型,其特点是用引号引起来,并且可以是使用单引号('字符串'),双引号("字符串"),三个 ...

  8. 浅谈Objective-C异常处理

    -----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培 ...

  9. 【转】Hibernate入门实例

    1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate OR ...

  10. 同时执行2个存储过程,2个SP中分别有相同的临时表名,会有冲突吗?

    同时执行2个存储过程,2个SP中分别有相同的临时表名,会有冲突吗?答案:不会 这就可以在以后写存储过程的时候统一临时表名了. alter procedure sp_01 as begin create ...