제출 #36888

#제출 시각아이디문제언어결과실행 시간메모리
36888aome괄호 문자열 (CEOI16_match)C++14
37 / 100
9 ms18052 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100005; int n; char res[N]; string s; pair<int, int> rmq[20][N]; void solve(int l, int r) { if (l > r) return; if (s[l] == s[r]) { res[l] = '(', res[r] = ')'; solve(l + 1, r - 1); return; } int cur = r, type = s[l] - 'a'; if (rmq[17][cur].second >> type & 1) { for (int j = 16; j >= 0; --j) { if (!(rmq[j][cur].second >> type & 1)) cur = rmq[j][cur].first; } cur = rmq[0][cur].first; } if (cur <= l || s[cur] != s[l]) { cout << -1; exit(0); } res[l] = '(', res[cur] = ')'; solve(l + 1, cur - 1), solve(cur + 1, r); } int main() { ios::sync_with_stdio(false); cin >> s, n = s.size(); for (int i = 0; i < n; ++i) { int type = s[i] - 'a'; rmq[0][i].first = i; if (i) { if (s[i - 1] == s[i]) { if (i - 2 >= 0) rmq[0][i].first = i - 2, rmq[0][i].second = 1 << (s[i - 2] - 'a'); else rmq[0][i].first = i; } else { int cur = i - 1; if (rmq[17][cur].second >> type & 1) { for (int j = 16; j >= 0; --j) { if (!(rmq[j][cur].second >> type & 1)) cur = rmq[j][cur].first; } cur = rmq[0][cur].first; if (cur) { cur--; rmq[0][i].first = cur; rmq[0][i].second = 1 << (s[cur] - 'a'); } } } } // cout << i << ' ' << rmq[0][i].first << '\n'; for (int j = 1; j <= 17; ++j) { int tmp = rmq[j - 1][i].first; rmq[j][i].first = rmq[j - 1][tmp].first; rmq[j][i].second |= rmq[j - 1][i].second | rmq[j - 1][tmp].second; } } if (n & 1) { cout << -1; return 0; } solve(0, n - 1); for (int i = 0; i < n; ++i) cout << res[i]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...