1 条题解
-
0
解题思路
首先,将字符串中的
+替换为 ,-替换为 。然后构造前缀和数组 ,其中 。同时构造数组 ,其中 表示满足 的最小下标 (如果不存在这样的下标,则 )。考虑
init = 0的第一次迭代:- 如果 ,则过程结束,
res = |s|。 - 否则,当
cur < 0的条件首次满足时, 的值等于 。因此,第一次迭代后res = f_1。
现在考虑第二次迭代(
init = 1):- 如果 ,则过程结束,
res = f_1 + |s|。 - 否则,
res = f_1 + f_2。
以此类推,可以计算出过程结束后的
res值。
C++ 代码实现
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) { string s; cin >> s; int n = s.size(); long long cur = 0, mn = 0, res = n; for (int i = 0; i < n; ++i) { cur += (s[i] == '+') ? 1 : -1; if (cur < mn) { mn = cur; res += i + 1; } } cout << res << '\n'; } return 0; } - 如果 ,则过程结束,
- 1
信息
- ID
- 6841
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者