제출 #567366

#제출 시각아이디문제언어결과실행 시간메모리
567366piOOE괄호 문자열 (CEOI16_match)C++17
100 / 100
20 ms13012 KiB
#include <bits/stdc++.h>

using namespace std;

#define all(x) begin(x), end(x)
#define sz(x) ((int)size(x))
#define trace(x) cout << #x << ": " << (x) << endl;

typedef long long ll;

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

const int A = 26, N = 100000;

int mx_prv[N][A];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    string s, ans;
    cin >> s;
    int n = sz(s);
    ans.resize(n);
    memset(mx_prv, -1, sizeof(mx_prv));
    for (int i = 1; i < n; ++i) {
        mx_prv[i][s[i] - 'a'] = i;
        for (int c = 0; c < A; ++c) {
            int j = mx_prv[i - 1][s[i] - 'a'] - 1;
            if (j >= 0 && mx_prv[i][c] == -1) {
                if ((s[j] - 'a') == c) {
                    mx_prv[i][c] = j;
                } else {
                    mx_prv[i][c] = mx_prv[j][c];
                }
            }
        }
    }
    vector<int> st;
    for (int i = 0; i < n; ++i) {
        if (st.empty() || s[st.back()] != s[i]) {
            st.push_back(i);
        } else {
            st.pop_back();
        }
    }
    if (!st.empty()) {
        cout << -1;
        return 0;
    }
    function<void(int, int)> solve = [&](int l, int r) {
        if (l >= r) return;
        int m = mx_prv[r][s[l] - 'a'];
        ans[l] = '(', ans[m] = ')';
        solve(l + 1, m - 1), solve(m + 1, r);
    };
    solve(0, n - 1);
    cout << ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...