#include <bits/stdc++.h>
#define int long long
using namespace std;
const int nmax = 1e6 + 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() {
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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |