1 solutions

  • 1
    @ 2025-8-15 14:24:53

    题意

    要求括号内的字符串反转并且大小写转换。

    思路

    可以模拟,先用栈的思想,记录起每个括号对应的合法括号的位置,solve(l,r,rev)solve(l, r, rev) 表示我们当前在处理 [l,r][l, r] 区间,这个区间被翻转了 revrev 次,当 revrev 是奇数时,我们只需要对整个区间倒序处理,否则就正序,模拟即可。

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 5e5 + 5;
    const int mod = 1e9 + 7;
    int to[N];
    string s;
    void solve(int l, int r, int rev)
    {
        if(r + rev == l) return;
        if (l == r)
        {
            if (rev == -1)
            {
                if (s[l] >= 'a' && s[l] <= 'z')
                {
                    cout << (char)(s[l] - 'a' + 'A');
                }
                else
                {
                    cout << (char)(s[l] - 'A' + 'a');
                }
            }
            else
            {
                cout << s[l];
            }
            return;
        }
        for(int i = l;;)
        {
    
            if (s[i] == '(' || s[i] == ')') {
                solve(to[i] - rev, i + rev, rev * -1);
                i = to[i] + rev;
            }
            else {
                solve(i, i, rev);
                i += rev;
            }
            if (r + rev == i) break;
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int tid; cin >> tid;
        cin >> s;
        int v = 0;
        vector<int> b;
        for(int i = 0; i < s.size(); i++)
        {
            if(s[i] == '(')
            {
                b.push_back(i);
            }
            else if(s[i] ==')')
            {
                int v = b.back();
                to[v] = i;
                to[i] = v;
                b.pop_back();
            }
        }
        solve(0, s.size() - 1, 1);
        return 0;
    }
    

    Information

    ID
    37
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    5
    Tags
    (None)
    # Submissions
    11
    Accepted
    5
    Uploaded By