1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int N = 1000010; struct node { int l, r, w; int imin, imax; }; node tree[4 * N]; int n, res[N]; char s[N]; void build(int k, int lef, int rig) { tree[k].l = lef, tree[k].r = rig; if (tree[k].l == tree[k].r) { tree[k].w = tree[k].imin = tree[k].imax = 0; return; } int mid = (lef + rig) / 2; build(k * 2, lef, mid); build(k * 2 + 1, mid + 1, rig); tree[k].w = tree[k * 2].w + tree[k * 2 + 1].w; tree[k].imax = max(tree[k * 2].imax, tree[k * 2 + 1].imax); tree[k].imin = max(tree[k * 2].imin, tree[k * 2 + 1].imin); } void change_point(int k, int x, int y) { if (tree[k].l == tree[k].r) { tree[k].w = y; return; } int mid = (tree[k].l + tree[k].r) / 2; if (x <= mid) change_point(2 * k, x, y); else change_point(2 * k + 1, x, y); tree[k].w = tree[k * 2].w + tree[k * 2 + 1].w; tree[k].imax = max(tree[k * 2].imax, tree[k * 2].w + tree[k * 2 + 1].imax); tree[k].imin = min(tree[k * 2].imin, tree[k * 2].w + tree[k * 2 + 1].imin); } int main() { scanf("%d%s", &n, s + 1); build(1, 1, n); int cur = 1, len = strlen(s + 1); for (int i = 1; i <= len; i++) { if ('(' == s[i]) change_point(1, cur, 1); else if (')' == s[i]) change_point(1, cur, -1); else if ('L' == s[i]) { if (cur >= 2) cur--; } else if ('R' == s[i]) cur++; else change_point(1, cur, 0); if (0 != tree[1].w || 0 != tree[1].imin) res[i] = -1; else res[i] = tree[1].imax; } for (int i = 1; i <= len; i++) { printf("%d", res[i]); printf(i == len ? "\n" : " "); } return 0; }
|