https://ac.nowcoder.com/acm/contest/3007/G
タイトル説明
ブラケットがある正当なシーケンスを定義します。
1.空のシーケンスは、シーケンス正当ブラケットであります
2. Sが正当括弧配列である場合、(S)は、法的ブラケットのシーケンスであります
3. AとBが合法ブラケットシーケンスである場合、それは正当なブラケットシーケンスABであります
さて、少なくともいくつかの削除括弧シーケンス合法的に取得しようとしているブラケット、括弧のシーケンスを与えられました
括弧系列長Nに設けられたT、データの各セットを含む入力データセット
1≤T、ΣN≤1,000,000
(空の文字列が正当ブラケット配列であるので、答えはNであってもよいです)
思考
スタックのシミュレーション、彼らがいる場合、スタックに入った、彼らがしている場合、スタックは、レコード番号空の場合、それはポップするスタックの一番上の左括弧がある場合、何を決定するために
#include <bits/stdc++.h>
using namespace std;
int T;
const int N = 1e6 + 10;
char s[N];
char st[N];
int top;
int n;
int ans() {
top = 0;
int res = 0;
for (int i = 1; i <= n; i++) {
if (s[i] == '(') {
st[++top] = '(';
}
else {
if (top == 0) ++res;
else if (st[top] == '(') {
top--;
}
}
}
res += top;
return res;
}
int main()
{
ios::sync_with_stdio(0);
cin >> T;
while (T--) {
cin >> n;
cin >> s + 1;
cout << ans() << "\n";
}
return 0;
}