括号序列的条件
一个序列是括号序列的条件是:在所有位置,前面(含当前位置)的左括号的数量大于等于右括号的数量,且最终相等。
例题:
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; }
此题的思路为,先构造一个最优的结果(尽可能将左边的"?"改为"(")。
然后尝试将最右边的"("与最左边的")"交换,(这样对中间的计数影响最小)
如果是合法的,说明存在其他修改的方案。