测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A6957. 完美的洗牌

编程题 普及/提高-

题目描述

魔术师手中有两叠扑克牌,我们把它们记作牌堆 $A$ 和牌堆 $B$。
牌堆 $A$ 中包含 $N$ 张牌,从上到下依次记录为字符串 $S_1$。
牌堆 $B$ 中包含 $M$ 张牌,从上到下依次记录为字符串 $S_2$。

现在魔术师进行一次“完美洗牌”操作:他将这就两堆牌交错地插在一起,形成了一堆新的牌(包含 $N+M$ 张),记作 $S_3$。

在洗牌过程中,魔术师必须遵守以下规则:
1. **顺序保留**:来自 $S_1$ 的牌在 $S_3$ 中的相对顺序不能改变;来自 $S_2$ 的牌在 $S_3$ 中的相对顺序也不能改变。
2. **完全使用**:$S_3$ 必须恰好包含 $S_1$ 和 $S_2$ 中的所有字符,不多也不少。

现在给你三个字符串 $S_1, S_2, S_3$,请你判断 $S_3$ 是否能由 $S_1$ 和 $S_2$ 通过上述“洗牌”规则得到。

输入格式

输入共三行。
第一行包含一个字符串 $S_1$。
第二行包含一个字符串 $S_2$。
第三行包含一个字符串 $S_3$。

输出格式

如果 $S_3$ 是由 $S_1$ 和 $S_2$ 交错组成的,输出 1;否则输出 0

输入输出样例

输入 #1
aabcc
dbbca
aadbbcbcac
输出 #1
1
输入 #2
aabcc
dbbca
aadbbbaccc
输出 #2
0

说明/提示

## 样例解释与数据范围

### 样例 #1 解释
**输出:1 (True)**
$S_1 = \text{"aabcc"}$, $S_2 = \text{"dbbca"}$
$S_3 = \text{"aadbbcbcac"}$
我们可以这样拆分 $S_3$:
- $S_3$ 的第 1, 2 位 aa 来自 $S_1$。
- $S_3$ 的第 3, 4, 5 位 dbb 来自 $S_2$。
- $S_3$ 的第 6 位 c 来自 $S_1$。
- $S_3$ 的第 7 位 b 来自 $S_2$。
- $S_3$ 的第 8 位 c 来自 $S_1$。
- $S_3$ 的第 9 位 a 来自 $S_2$。
- $S_3$ 的第 10 位 c 来自 $S_1$。
合并起来正是 $S_1$ 和 $S_2$ 的顺序交错。

### 样例 #2 解释
**输出:0 (False)**
虽然 $S_3$ 包含了 $S_1$ 和 $S_2$ 的所有字符,但在尝试匹配时会发现,无法在保持 $S_1$ 和 $S_2$ 内部顺序的前提下组成 $S_3$。例如最后两个字符 cc 无法在不打乱顺序的情况下被放置。

### 数据范围

对于 $100\%$ 的数据:
- 字符串仅包含小写英文字母。
- $0 \le |S_1|, |S_2| \le 200$。
- $0 \le |S_3| \le 400$。

**数据点分布:**
- 测试点 1-5:$|S_1|, |S_2| \le 5$ (极小数据)
- 测试点 6-15:$|S_1|, |S_2| \le 50$
- 测试点 16-25:$|S_1|, |S_2| \le 200$
上一题 去做题 下一题