C. Serval and Parenthesis Sequence
Solution
要求一个每一个前缀都不是好括号串的好括号串。如果令“(”为+1,“)”为-1,则一个好括号串的和为0,所以现在就变成了求一个每一个前缀和都大于0且总和等于0的串。贪心地想,前面出现的+1越多越难小于0,但一个好括号串的左右括号数量是固定的n/2,所以可以从后往前补“)”,补够后剩下的(也就是之前的)“?”处全为左括号,最后再判一遍生成的括号序列是否为好括号串即可。
Code
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
int sum = 0, cnt = 0;
if (n % 2) { cout << ":(" << endl; return 0; }
for (int i = 0; i < n; i++)
if (s[i] == ')')cnt++;
cnt = n / 2 - cnt;//还需要补几个右括号
for (int i = n - 1; i >= 0; i--) {
if (cnt == 0)break;
if (s[i] == '?')s[i] = ')', cnt--;
}
for (int i = 0; i < n; i++) {
if (s[i] == ')') sum--;
else s[i] = '(', sum++;
if (sum < 0 || (i != n - 1 && sum == 0)) { cout << ":(" << endl; return 0; }
}
if (!sum) cout << s << endl;
else cout << ":(" << endl;
return 0;
}