解法
シミュレーション
Stack \(t\) を使ったシミュレーションをする. 文字列 \(s\) を前から調べていき,今の文字で場合分け.
- ')'のとき: \(t\) が空なら,対応する'('が存在しないため失敗. 空でないとき,\(t\) の末尾が '('なら OK, ')'なら対応する '('が無くて失敗.
- '('のとき: \(t\) に '('を追加.
これでも AC であるが,さらに簡略化できる. Stack \(t\) には '(' しか入っていないので, '('の個数だけ記録しておけば,stack を使わなくても 同じシミュレーションが出来る.
つまり,'(' の個数 \(cnt\) を記録しておいて, 常に \(cnt \geq 0\) かつ シミュレーションが終わった時点で \(cnt = 0\) が,\(s\) が正しい括弧列である必要十分. これは良く知られた条件だが,シミュレーションの簡略化として得られた.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
string s; cin >> s;
ll x = 0;
ll n = s.length();
rep(i,n){
if(s[i] == '('){
x++;
}else{
x--;
}
if(x < 0){
cout << "No" << endl;
return 0;
}
}
if(x == 0) cout << "Yes" << endl;
else cout << "No" << endl;
return 0;
}