题目
解题思路:
这道问题的解题思路主要是通过处理环形字符串来找到连续没有天兵把守的道路的最长长度。具体解题步骤和所采用的算法如下:
1.环形字符串处理
-
因为道路是环形的,所以需要考虑从字符串的末尾回到开头的情况。为了处理这种情况,可以将原始字符串
s
拼接两次,这样可以把环形问题转化为非环形问题。即,通过拼接字符串,我们可以在s + s
中找到连续的最长子序列,而不需要处理环形的复杂情况。
2.动态规划
-
使用一个数组
a
来记录从当前位置开始的连续无天兵把守的道路的长度。 -
遍历拼接后的字符串
s + s
,根据当前位置的状态更新a
数组。 -
如果当前道路没有天兵把守(
Q
),则当前长度为前一个长度加1;如果有天兵把守(L
),则当前长度重置为0。
3.计算最长连续长度
-
在遍历结束后,计算每条道路在拼接后的字符串中最大连续无天兵把守的长度,并找出最大值。
4.输出结果
-
根据最大长度计算所有分身采摘的蟠桃数量的最大可能值。
运行结果
c++代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e5 + 10; // 可能的最大值,确保足够大
LL a[2 * N];
int main() {
int n;
cin >> n;
string s;
cin >> s;
// 遍历拼接后的字符串
if (s[0] == 'Q') {
a[0] = 1;
} else {
a[0] = 0;
}
// 每条道路在连续移动时的最长无天兵把守的长度
for (int i = 1; i < 2 * n; ++i) {
int index = i % n; // 索引在原始字符串中的位置
if (s[index] == 'Q') {
a[i] = a[i - 1] + 1; // 如果当前道路没有天兵把守,长度增加1
} else {
a[i] = 0; // 如果当前道路有天兵把守,长度重置为0
}
}
LL SUM = 0;
// 计算每条道路的最大无天兵把守长度,并累加到SUM
for (int i = 0; i < n; ++i) {
SUM += max(a[i], a[n + i]);
}
cout << SUM << endl;
return 0;
}