Submission #800933

#TimeUsernameProblemLanguageResultExecution timeMemory
800933gun_ganHomework (CEOI22_homework)C++17
100 / 100
234 ms129048 KiB
#include <bits/stdc++.h>
using namespace std;

const int MX = 2e6 + 5;

int N;
vector<int> g[MX];
bool type[MX];
int n, m;

pair<int, int> dfs(int v) {
	// cout << "traverse " << v << " type " << type[v] << '\n';
	if(g[v].empty()) {
		return make_pair(1, m);
	}

	auto [l1, r1] = dfs(g[v][0]);
	auto [l2, r2] = dfs(g[v][1]);
	
	assert(1 <= l1 && r1 <= m);
	assert(1 <= l2 && r2 <= m);
	
	if(!type[v]) {
		return make_pair(min(l1, l2), min(r1, r2) - (m - max(r1, r2)) - 1);
	} else {
		return make_pair(max(l1, l2) + min(l1, l2), max(r1, r2));
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	
	string s;
	cin >> s;
	
	N = s.size();
	
	vector<int> v;
	
	for(int i = 0; i < N; i++) {
		// cout << i << " " << s[i] << '\n';
		if(s[i] == '?') { 
			m++;
			n++;
			if(n > 1)
				g[v.back()].push_back(n);
			continue;
		}
		
		if(s[i] == ')') {
			v.pop_back();
		}
		
		if(s[i] != 'm') continue;
		
		if(s[i + 1] == 'a') {
			n++;
			type[n] = 1;
			if(n > 1)
				g[v.back()].push_back(n);
			v.push_back(n);
		} else {
			n++;
			type[n] = 0;
			if(n > 1)
				g[v.back()].push_back(n);
			v.push_back(n);
		}
	}
	
	auto [l, r] = dfs(1);
	
	// cout << l << " " << r << '\n';
	
	cout << r - l + 1 << '\n';
}
#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...