括号序列的条件

一个序列是括号序列的条件是:在所有位置,前面(含当前位置)的左括号的数量大于等于右括号的数量,且最终相等。

例题:

https://codeforces.com/contest/1709/problem/C

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<long long, long long> PLL;


void YD()
{
    string str;
    cin >> str;
    int l = 0, r = 0, q = 0;
    for (auto ch : str)
    {
        if (ch == '(') l++;
        else if (ch == ')') r++;
        else q++;
    }
    int x = r + q - l;
    x >>= 1;
    if (x < 0)
    {
        cout << "YES" << endl;
        return;
    }

    int n = str.size();
    vector<int> mark(n);
    for (int i = 0; i < n; i++)
    {
        if (str[i] == '?')
        {
            if (x)
                mark[i] = 1, x--;
            else
                mark[i] = 2;
        }
    }
    int ll = -1, rr = -1;
    for (int i = 0; i < n; i++)
    {
        if (mark[i] == 2)
        {
            rr = i; break;
        }
    }
    for (int i = n-1; i >=0; i--)
    {
        if (mark[i] == 1)
        {
            ll = i; break;
        }
    }
    if (ll == -1 || rr == -1)
    {
        cout << "YES" << endl;
        return;
    }
    mark[ll] = 2;
    mark[rr] = 1;
    for (int i = 0; i < n; i++)
    {
        if (mark[i] == 1)
            str[i] = '(';
        if (mark[i] == 2)
            str[i] = ')';
    }
    ll = 0, rr = 0;
    for (int i = 0; i < n; i++)
    {
        if (str[i] == '(')
            ll++;
        else
            rr++;
        if (rr > ll)
        {
            cout << "YES" << endl;
            return;
        }
    }
    cout << "NO" << endl;

}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    cin >> T;
    while (T--)
    {
        YD();
    }
    return 0;
}
View Code
复制代码

此题的思路为,先构造一个最优的结果(尽可能将左边的"?"改为"(")。

然后尝试将最右边的"("与最左边的")"交换,(这样对中间的计数影响最小)

如果是合法的,说明存在其他修改的方案。

posted @   80k  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示