結果
| 問題 | No.3503 Brackets Stack Query 2 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 15:07:26 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,289 bytes |
| 記録 | |
| コンパイル時間 | 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 |
ソースコード
#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;
}