結果

問題 No.3503 Brackets Stack Query 2
コンテスト
ユーザー Qiu Tian
提出日時 2026-04-18 15:07:26
言語 C++23
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 3,289 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,395 ms
コンパイル使用メモリ 338,332 KB
実行使用メモリ 9,392 KB
最終ジャッジ日時 2026-04-18 15:07:34
合計ジャッジ時間 7,454 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 4 WA * 26
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

struct Node {
    int prev;   // previous open frame
    int state;  // 0,1,2,3
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int Q;
    cin >> Q;

    vector<Node> st(1, {-1, 0}); // st[0] is dummy null
    vector<int> topv(1, 0);      // top node id for each prefix
    vector<char> badv(1, 0);     // whether current prefix is invalid
    vector<char> donev(1, 0);    // whether we have completed a top-level good string

    auto push_node = [&](int prev, int state) {
        st.push_back({prev, state});
        return (int)st.size() - 1;
    };

    for (int qi = 0; qi < Q; qi++) {
        int t;
        cin >> t;

        if (t == 1) {
            char c;
            cin >> c;

            int top = topv.back();
            bool bad = badv.back();
            bool done = donev.back();

            int newTop = top;
            bool newBad = bad;
            bool newDone = done;

            if (bad) {
                // once invalid, appending keeps it invalid
                newBad = true;
            } else if (c == '(') {
                // can only start a new frame if we haven't finished a top-level good string
                if (top == 0 && done) {
                    newBad = true;
                } else {
                    newTop = push_node(top, 0);
                    newDone = false;
                }
            } else if (c == '|') {
                if (top == 0) {
                    newBad = true;
                } else {
                    int s = st[top].state;
                    if (s == 0 || s == 1) {
                        // move to the second part
                        newTop = push_node(st[top].prev, 2);
                        newDone = false;
                    } else {
                        newBad = true;
                    }
                }
            } else if (c == ')') {
                if (top == 0) {
                    newBad = true;
                } else {
                    int s = st[top].state;
                    int parent = st[top].prev;

                    // close current frame
                    if (parent == 0) {
                        // top-level expression finished
                        newTop = 0;
                        newDone = true;
                    } else {
                        int ps = st[parent].state;
                        if (ps == 0) {
                            newTop = push_node(st[parent].prev, 1);
                        } else if (ps == 2) {
                            newTop = push_node(st[parent].prev, 3);
                        } else {
                            newBad = true;
                        }
                        newDone = false;
                    }
                }
            } else {
                newBad = true;
            }

            topv.push_back(newTop);
            badv.push_back(newBad);
            donev.push_back(newDone);
        } else {
            // delete last character
            topv.pop_back();
            badv.pop_back();
            donev.pop_back();
        }

        // good iff not invalid and no open frames
        cout << ((!badv.back() && topv.back() == 0) ? "Yes" : "No") << '\n';
    }

    return 0;
}
0