列表

详情


NC14272. Fantasy Strange Tree

描述

FST的脑洞非常大,经常幻想出一些奇怪的东西。
某一天,FST幻想出了一棵没有边际的二叉树,脑补着在那棵二叉树上行走的场景。
FST一开始在二叉树的根,然后FST写下了一个由‘L’‘R’两种种字符构成的串,他称这个串为初始串,按照这个串的顺序,碰到一个‘L’就移动到左儿子,碰到一个‘R’就移动到右儿子。FST最后的位置就是他的起点。
然后FST有写下一个串,他称这个串为操作串,由‘U’‘L’‘R’三种字符构成,‘U’表示移动到当前点的父亲(特殊地,我们定义根节点的父亲为根自己),‘L’‘R’同上。
但是FST觉得直接按照操作串一步一步走十分无聊,所以FST会跳过一些操作(心情不好的时候也可能跳过所有操作,或不跳过),现在FST想知道他会走到多少种可能的终点。
由于答案可能很大,所以只需输出答案mod (109+7)的值。

输入描述

第一行一个由‘L’‘R’两种字符构成的串。
第二行一个由‘U’‘L’‘R’三种字符构成的串。
串长度≤105

输出描述

输出一行,为答案mod(109+7)。

示例1

输入:

LL
RU

输出:

3

说明:

FST可以操作的串为‘’‘R’‘U’‘RU’。
但是串‘RU’的效果和串‘’是一样的,所以只能走到3个节点,如下图:
         
(这棵二叉树的大小是无穷的,这里只画出一部分)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 8ms, 内存消耗: 740K, 提交时间: 2023-03-08 23:26:18

#include <bits/stdc++.h>

using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7;
typedef long long LL;
#define eps 1e-7

string s, t; 

void solve() {
	cin >> t >> s;
	
	int ts = t.size();
	LL l = 1, r = 1;
	LL ans = 1;
	
	for(auto x : s) {
		if(x == 'L') {
			ans = (ans + l) % mod;
			r = (r + l) % mod;
		} else if(x == 'R') {
			ans = (ans + r) % mod;
			l = (l + r) % mod;
		} else if(x == 'U') {
			if(ts) {
				ts --;
                ans = (ans + 1) % mod;
				if(t[ts] == 'R') l = (l + 1) % mod;
				else r = (r + 1) % mod;
			}
		}
	}
	
	cout << ans << '\n';
}

int main() {
	//ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	int T = 1;
	//cin >> T;
	while(T -- ) {
		solve();
	}
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-07-01 21:59:09

#include<bits/stdc++.h>
#define Fox ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int N=1e5+10;
const int mod=1e9+7;
char s[N],t[N],c;
int n,m,ans,dp[4];
int main(){
	Fox;
	cin>>(s+1)>>(t+1);
	n=strlen(t+1);
	m=strlen(s+1);
	dp[0]=1;
	for(int i=1;i<=n;i++){
		if(t[i]=='U'){
			if(m){
				c=s[m--];
				if(c=='L')dp[1]++;
				else dp[2]++;
			}
			continue;
		}
		if(t[i]=='L'){
			dp[1]=(dp[1]+dp[0])%mod;
			dp[3]=(dp[3]+dp[2])%mod;
			dp[0]=(dp[0]+dp[2])%mod;
			dp[2]=0;
		}
		else{
			dp[2]=(dp[2]+dp[0])%mod;
			dp[3]=(dp[3]+dp[1])%mod;
			dp[0]=(dp[0]+dp[1])%mod;
			dp[1]=0;
		}
	}
	for(int i=0;i<4;i++)ans=(ans+dp[i])%mod;
	cout<<ans;
    return 0;
}

上一题