Submission #1288093

#TimeUsernameProblemLanguageResultExecution timeMemory
1288093stefanneaguHomework (CEOI22_homework)C++20
100 / 100
224 ms153452 KiB
#include <bits/stdc++.h>
// #define int long long

using namespace std;

const int nmax = 2e6 + 1;

vector<int> adj[nmax];
pair<int, int> dp[nmax];
int sub[nmax];
bool tip[nmax];

void dfs(int i) {
    if (adj[i].size() == 0) {
        sub[i] = 1;
        dp[i] = {0, 0};
        return;
    }
    int f1 = -1, f2 = -1;
    for (auto it : adj[i]) {
        dfs(it);
        sub[i] += sub[it];
        f2 = f1;
        f1 = it;
    }
    if (tip[i] == 0) {
        dp[i].first = min(dp[f1].first, dp[f2].first);
        dp[i].second = dp[f1].second + dp[f2].second + 1;
    } else {
        dp[i].second = min(dp[f1].second, dp[f2].second);
        dp[i].first = dp[f1].first + dp[f2].first + 1;
    }
    // cout << i << ": " << dp[i].first << " " << dp[i].second << ", " << sub[i] << '\n';
}

int32_t main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    string s;
    cin >> s;
    vector<pair<bool, bool>> v;
    int n = 0;
    for (int i = 0; i < s.size(); i++) {
        n += (s[i] == '?');
        if (s[i] == ')') {
            v.push_back({1, 0});
        }
        if (s[i] == 'm') {
            if (s[i + 1] == 'a') {
                v.push_back({0, 1});
            } else {
                v.push_back({0, 0});
            }
        }
    }
    stack<int> st;
    int cnt = 0;
    for (int i = 0; i < v.size() - 1; i++) {
        if (v[i].first == 0) {
            // (
            cnt++;
            tip[cnt] = v[i].second;
            st.push(cnt);
        } else {
            // )
            assert(st.size() > 1);
            int tp = st.top();
            st.pop();
            int tata = st.top();
            adj[tata].push_back(tp);
        }
    }
    int cc = cnt;
    for (int i = 1; i <= cc; i++) {
        while (adj[i].size() < 2) {
            cnt++;
            adj[i].push_back(cnt);
        }
    }
    dfs(1);
    cout << (n - 1 - dp[1].second) - dp[1].first + 1;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...