1 条题解

  • 0
    @ 2026-5-4 21:46:42

    解题思路

    首先,将字符串中的 + 替换为 11- 替换为 1-1。然后构造前缀和数组 pp,其中 pi=j=1isjp_i = \sum_{j=1}^i s_j。同时构造数组 ff,其中 fif_i 表示满足 pj=ip_j = -i 的最小下标 jj(如果不存在这样的下标,则 fi=1f_i = -1)。

    考虑 init = 0 的第一次迭代:

    • 如果 f1=1f_1 = -1,则过程结束,res = |s|
    • 否则,当 cur < 0 的条件首次满足时,ii 的值等于 f1f_1。因此,第一次迭代后 res = f_1

    现在考虑第二次迭代(init = 1):

    • 如果 f2=1f_2 = -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
    上传者