树上行走

题目背景

\(\mathrm{Smart}\) 的脑洞非常大, 经常幻想出一些奇怪的东西。

题目描述

某一天,\(\mathrm{Smart}\) 幻想出了一棵没有边际的二叉树,脑补着在那棵二叉树上行走的场景。

\(\mathrm{Smart}\) 一开始在二叉树的根, 然后 \(\mathrm{Smart}\) 写下了一个由'L','R'两种字符构成的串,他称这个串为初始串,按照这个串的顺序, 碰到一个'L'就移动到左儿子,碰到一个'R' 就移动到右儿子。

\(\mathrm{Smart}\) 最后的位置就是他接下来操作的起点。

然后 \(\mathrm{Smart}\) 有写下一个串,他称这个串为操作串,由'U','L','R'三种字符构成,'U'表示移动到当前点的父亲(特殊地, 我们定义根节点

的父亲为根自己) ,'L','R'同上。

但是 \(\mathrm{Smart}\) 觉得直接按照操作串一步一步走十分无聊,所以 \(\mathrm{Smart}\) 会跳过一些操作(心情不好的时候也可能跳过所有操作, 或不跳过) ,现在 \(\mathrm{Smart}\) 想知道他会走到多少种可能的终点。 由于答案可能很大, 所以只需输出答案\(\mod 1,000,000,007\)的值。

输入输出格式

输入格式

第一行一个由'L','R' 两种字符构成的串。

第二行一个由'U','L','R' 三种字符构成的串。

输出格式

说明:

输出一行,为答案\(\mod 1000000007\)。

\(30\%\)的数据: 初始串长度\(\le 10\),操作串长度\(\le 5\);

\(50\%\)的数据: 初始串长度\(\le 100\), 操作串长度\(\le 10\);

另有\(20\%\)的数据: 操作串中没有'U'操作。

\(100\%\)的数据: 初始串长度\(\le 10^5\),操作串长度\(\le 10^5\)。


感觉非常神的一题,考试时至少想了两个小时无果。

想的是特殊数据,知道特殊数据了以后其实好做了

其间想过 几种简单DP 容斥 打表 子问题分治 字典序(康拓)展开 特殊情况找规律 几个方法 全凉了

事实上后面一段时间我一直在想“一个01串有多少种不同的子序列?”这个抽象的问题,殊不知,原本的题目给出的模型和解法更加贴近。

我们先给出一个大题的思路,然后具体讲解。

将答案分成2^字符集大小的容器进行统计

具体的,我们把统计的节点分为以下4类

分别代表:左右儿子都没去过的点,只去过左儿子的点,只去过右儿子的点,两个儿子都去过的点

我们用容器分别存这四类点的个数

然后从左往右做操作,更新谁谁走成了谁睡

如果加入'U'其实也很简单

只有最开始的'U'是有用的,把最开始的操作存起来,然后碰到一个就倒着弹出一个,更新某个状态就行啦


Code:

#include <cstdio>
#include <cstring>
#define ll long long
const ll mod=1e9+7;
const int N=1e5+10;
char t[N],s[N];
int tot;
ll dp[4];
int main()
{
scanf("%s",s+1);
tot=strlen(s+1);
scanf("%s",t);
int n=strlen(t);
dp[0]=1;
for(int i=0;i<n;i++)
{
if(t[i]=='L')
{
(dp[1]+=dp[0])%=mod;
(dp[0]+=dp[2])%=mod;
(dp[3]+=dp[2])%=mod;
dp[2]=0;
}
else if(t[i]=='R')
{
(dp[2]+=dp[0])%=mod;
(dp[0]+=dp[1])%=mod;
(dp[3]+=dp[1])%=mod;
dp[1]=0;
}
else if(tot)
{
if(s[tot--]=='L') ++dp[1];
else ++dp[2];
}
}
ll ans=((dp[0]+dp[1])%mod+(dp[2]+dp[3])%mod)%mod;
printf("%lld\n",ans);
return 0;
}

2018.8.17([数据已删除])

安徽师大附中%你赛day5 T3 树上行走 解题报告的更多相关文章

  1. 安徽师大附中%你赛day9 T3 贵 解题报告

    贵 问题描述 苟先生的狼狗大军没有追上富先生, 所以他把它们都解雇了, 决定去雇佣一些更好的狗, 不过狗可是很贵的.苟先生有 \(w\) 元钱, 有 \(n\) 条狗可以雇佣, 第 \(i\) 条狗有 ...

  2. 安徽师大附中%你赛day6 T3 Hamsters [POI2010]CHO-Hamsters 解题报告

    [POI2010]CHO-Hamsters 题意: 给出n个互不包含的字符串,要求你求出一个最短的字符串S,使得这n个字符串在S中总共至少出现m次,问S最短是多少? 范围: \(1 \le n \le ...

  3. 安徽师大附中%你赛day2T3 巧克力 解题报告

    巧克力 题目描述 小\(T\)有\(N\)块巧克力, 每块巧克力上都有一句话(由小写英文字母组成,不含标点) .现在每块巧克力都断成了若干截,更糟糕的是,有一些碎片丢失了 ,但是剩下的碎片之间的顺序是 ...

  4. 安徽师大附中%你赛day3T1 怜香惜玉 解题报告

    怜香惜玉 题意: 已知 \(f(x)=\frac{2 \times \sum_{(i,x)=1}^x i}{φ(x)}\) 先给定数据组数\(t\)和\(k\) 每组数据给出\(n\),求\(\sum ...

  5. 安徽师大附中%你赛day9 T2 富 解题报告

    富 题目背景 出于某些原因, 苟先生在追杀富先生. 题目描述 富先生所在的地方是一个\(n\times m\)的网格,苟先生排出了他的狼狗大军,共有\(k\)条狗,第\(i\)条狗所在的位置为\((x ...

  6. 安徽师大附中%你赛day7 T2 乘积 解题报告

    乘积 题目背景 \(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数. 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\).\(7\) ...

  7. 安徽师大附中%你赛day4T2 演讲解题报告

    演讲 题目背景: 众所周知,\(\mathrm{Zdrcl}\)是一名天天\(\mathrm{AK}\)的高水平选手. 作为一民长者,为了向大家讲述自己\(\mathrm{AK}\)的经验,他决定在一 ...

  8. 安徽师大附中%你赛day4T1 金字塔 解题报告

    金字塔 题目背景: \(Zdrcl\)带着妹子们来到了胡夫金字塔周边旅游, 发现这里正在进行一个有关金字塔的游戏 题目描述: 游戏规则如下: 1. 这里的金字塔是一个 \(N\) 阶的二维金字塔. 2 ...

  9. 「2018-12-02模拟赛」T3 约束排列 解题报告

    3.约束排列(place.pas/cpp/in/out) 问题描述: 给出 n 个互不相同的小写字母,表示出现的字符类型,以及 k 个约束关系: .....,表示 ai 必须出现在 bi 前面(ai, ...

随机推荐

  1. Vue+webpack构建一个项目

    1.安装CLI命令的工具  推荐用淘宝的镜像 npm install -g @vue/cli @vue/cli-init 2.使用命令构建一个名为myapp的项目 vue init webpack m ...

  2. php-5.6.26源代码 - hash存储结构 - 添加

    添加 , (void *)module, sizeof(zend_module_entry), (void**)&module_ptr){ // zend_hash_add 定义在文件“php ...

  3. ZooKeeper异常:Error connecting service It is probably not running

    ZooKeeper安装后使用以下命令可以启动成功 bin/zkServer.sh start 但是使用下面命令查看启动状态,则报错误: bin/zkServer.sh status Error con ...

  4. C# 生成机器码

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Django中的select_related与prefetch_related

      Django是一个基于Python的网站开发框架,一个很重要的特点就是Battery Included,简单来说就是包含了常规开发中所需要的一切东西,包括但不限于完整的ORM模型.中间件.会话处理 ...

  6. LARK BOARD开发板入门学习-第2篇

    1. 本次主要研究下HDMI接口,使用芯片是CH7033,这个芯片可以接VGA和HDMI两种接口,和FPGA的接口是地址数据总线 2. 值得注意的地方,下图的D1,双二极管BAT54S在电路中一般用于 ...

  7. Windows Server Backup 裸机恢复

    1.打开“Windows Server Backup”选择本地备份,并在操作栏选择“一次性备份”:(在实际生产环境中可以根据自己的需求,选择一次性备份还是选择备份计划.) 2.打开“一次性备份向导”, ...

  8. Unity3d工具方法小集

    1.获取垂直水平方向上的输入: float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = I ...

  9. 给socks-proxy-agent增加认证

    由于需要使用socks代理,查看了nodejs的各种socks库,最终的结论是socks库是其中最完善的,而socks-proxy-agent是以其为基础的封装,可以直接和http模块对接. 不过在尝 ...

  10. 第二十一篇 json,picklz,xml模块

    Json模块 Json模块比较简单,仅有四个方法dumps()和loads()方法,dump()和load()方法,但是却非常的常用,实用性极强. 如果要在不同的编程语言之间传递对象,就必须把对象序列 ...