競技プログラミング日記

主に AtCoder の記事です

PAST013E問題

PAST013E

解法
シミュレーション

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;
}