Glaciaxion
题目描述
冰封的世界可以看作是 $ n $ 块初始时冷冻的冰川,这些冰川被编号为 1 ∼ n 1 \sim n 1∼n。
探测器抵达后的 $ m $ 秒,每秒都会探测到一块冰川融化。
当一块冰川第一次融化时,探测器返回 N
,否则返回 Y
。
你需要根据探测器按顺序返回的信息,给出字典序最小的冰川融化过程的编号序列。如果不存在这样的编号序列,请输出 No solution
报告无解。
输入格式
第一行两个整数 $ n,m $。
接下来一行 $ m $ 个字符(N
或 Y
,不加分隔),表示探测器按顺序返回的结果。
输出格式
一行一个长度为 $ m $ 的整数序列(空格分隔),表示字典序最小的冰川融化过程的编号序列,或输出 No solution
报告无解。
样例 #1
样例输入 #1
3 4
NYNY
样例输出 #1
1 1 2 1
样例 #2
样例输入 #2
5 3
YYY
样例输出 #2
No solution
样例 #3
样例输入 #3
5 7
NNNNNYN
样例输出 #3
No solution
提示
【样例 1 解释】
第 1 秒,1 号冰川融化,这是其首次融化,返回 N
。
第 2 秒,1 号冰川融化,这不是其首次融化,因为已经在第 1 秒融化过,返回 Y
。
第 3 秒,2 号冰川融化,这是其首次融化,返回 N
。
第 4 秒,1 号冰川融化,这不是其首次融化,因为已经在第 1,2 秒融化过,返回 Y
。
【数据范围】
对于 $ 100% $ 的数据,$ 1 \le n,m \le 10^6 $。
提示:本题开启捆绑测试。
Subtask Sp. Constraints Score 1 n , m ≤ 8 23 2 n , m ≤ 1000 25 3 探测器返回结果只有一种字符 15 4 保证有解 17 5 无特殊限制 20 \def\r{\cr\hline} \def\None{\text{None}} \def\arraystretch{1.5} \begin{array}{c|c|c} \textbf{Subtask} & \textbf{Sp. Constraints} & \textbf{Score}\r \textsf1& n,m\le 8 & 23 \r \textsf2& n,m\le 1000 & 25 \r \textsf3& 探测器返回结果只有一种字符 & 15 \r \textsf4& 保证有解 & 17 \r \textsf5& 无特殊限制 & 20 \r \end{array} Subtask12345Sp. Constraintsn,m≤8n,m≤1000探测器返回结果只有一种字符保证有解无特殊限制Score2325151720
解题思路
- 首先,根据题目要求,我们需要读入冰川数量 n 和探测次数 m。
- 接下来,我们需要读入一个字符串 s,表示探测结果。在这个字符串中,每个字符 ‘Y’ 表示冰川融化,‘N’ 表示冰川没有融化。
- 我们使用一个循环来处理每次探测的结果。在循环内部,我们检查以下几种情况:
- 如果第一个探测结果就是 ‘Y’,说明第一个冰川就融化了,因此无解,直接输出 “No solution”。
- 如果当前冰川没有融化(‘N’),我们将当前的冰川编号添加到 last 中,并递增计数器 count。
- 如果 count 超过了 n+1,说明编号超出了冰川数量,也无解,直接输出 “No solution”。
- 如果当前冰川融化了(‘Y’),我们添加 ‘1’ 表示第一个融化的冰川到 last 中。
- 循环结束后,我们输出最终的冰川融化顺序 last。
#include <bits/stdc++.h>
using namespace std;int main() {int n, m;cin >> n >> m; // 输入冰川数量 n 和探测次数 mstring last, s;cin >> s; // 输入探测结果字符串int count = 1; // 初始化计数器,表示冰川编号for (int i = 0; i < m; i++) { // 遍历探测结果if (s[0] == 'Y') { // 如果第一个探测结果就是 'Y',无解cout << "No solution";return 0;}else if (s[i] == 'N') { // 如果冰川没有融化last += to_string(count); // 将当前冰川编号添加到 lastlast += ' '; // 加一个空格,以便后面的输出count++; // 冰川编号加一if (count > n + 1) { // 如果编号超出冰川数量,无解cout << "No solution";return 0;}}else if (s[i] == 'Y') { // 如果冰川融化了last += '1'; // 添加 '1' 表示第一个融化的冰川last += ' '; // 加一个空格,以便后面的输出}}// 输出最终的冰川融化顺序cout << last;return 0;
}