結果

問題 No.3503 Brackets Stack Query 2
コンテスト
ユーザー Azaki
提出日時 2026-04-18 03:46:19
言語 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
結果
AC  
実行時間 54 ms / 2,000 ms
コード長 2,299 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,217 ms
コンパイル使用メモリ 159,620 KB
実行使用メモリ 16,128 KB
最終ジャッジ日時 2026-04-18 03:46:28
合計ジャッジ時間 8,080 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <iostream>
#include <vector>

using namespace std;

// Cấu trúc một nút trong "Persistent Stack"
struct Node {
    char c;
    int parent;
    int depth;
};

// Mảng lưu các trạng thái stack
// Q <= 8e5, mỗi Node tốn khoảng 12 bytes -> ~10MB, rất an toàn.
Node nodes[800005];
int state_at_step[800005]; // Trạng thái stack sau truy vấn thứ i của chuỗi S

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int Q;
    cin >> Q;

    // Trạng thái ban đầu (stack rỗng)
    nodes[0] = {' ', -1, 0};
    state_at_step[0] = 0;
    
    int s_len = 0; // Độ dài thực tế của chuỗi S
    int node_count = 0; // Tổng số nút đã tạo ra

    for (int i = 0; i < Q; ++i) {
        int type;
        cin >> type;

        if (type == 1) {
            char c;
            cin >> c;
            
            int prev_state = state_at_step[s_len];
            s_len++;

            // Thử kiểm tra xem có tạo thành bộ (|) không
            bool simplified = false;
            if (c == ')') {
                int p1 = prev_state; // Nút chứa '|' ?
                if (p1 != 0 && nodes[p1].c == '|') {
                    int p2 = nodes[p1].parent; // Nút chứa '(' ?
                    if (p2 != 0 && nodes[p2].c == '(') {
                        // Nếu khớp (|), trạng thái mới chính là trạng thái trước khi có '('
                        state_at_step[s_len] = nodes[p2].parent;
                        simplified = true;
                    }
                }
            }

            if (!simplified) {
                // Nếu không rút gọn được, tạo một nút mới trong cây stack
                node_count++;
                nodes[node_count] = {c, prev_state, nodes[prev_state].depth + 1};
                state_at_step[s_len] = node_count;
            }
        } else {
            // Loại 2: Xóa ký tự cuối của S, chỉ cần quay về trạng thái trước
            if (s_len > 0) s_len--;
        }

        // Chuỗi S là dãy tốt nếu trạng thái stack hiện tại là rỗng (nút 0)
        if (state_at_step[s_len] == 0) {
            cout << "Yes\n";
        } else {
            cout << "No\n";
        }
    }

    return 0;
}
0