Submission #1331764

#TimeUsernameProblemLanguageResultExecution timeMemory
1331764WH8Homework (CEOI22_homework)C++17
0 / 100
143 ms79224 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
#define pb push_back
#define sz(x) (int)x.size()

const int maxn=1000005;
int p[maxn];
int par(int x){
	if(p[x]==0)return x;
	return p[x]=par(p[x]);
}

signed main(){
	string s;cin>>s;
	vector<char> t(maxn);
	vector<vector<int>> ch(maxn), cl(maxn);
	vector<int> v, pa(maxn);
	int ptr=1, n=0;
	for(char c : s){
		if(c=='m' or c=='a' or c=='i' or c=='(' or c==')' or c==',')continue;
		int ind = ptr++;
		t[ind]=c;
		if(c=='?'){
			n++;
			assert(t[v.back()] == 'n' or t[v.back()] == 'x');
			int cur=ind;
			while(true){
				ch[v.back()].pb(cur);
				pa[cur]=v.back();
				if(t[v.back()] == t[cur])p[cur]=v.back();
				if(sz(ch[v.back()]) == 2){
					cur=v.back();
					v.pop_back();
				}
				else break;
			}
		}
		else v.pb(ind);
		/*for(auto it : v){
			cout<<t[it]<<" ";
		}
		cout<<endl;*/
	}
	for(int i=1;i<ptr;i++){
		int head=par(i);
		for(auto it : ch[i]){
			if(t[it] != t[i]){
				cl[head].pb(it);
			}
		}
	}
	vector<int> num(n+1, 0);
	auto dfs=[&](auto && dfs, int x, int lt, int gt) -> void{
		//cout<<"at node x " << x<<" type is " << t[x]<<endl;
		int nc=0;
		for(auto it : cl[x]){
			nc++;
			//cout<<"children " << it<<endl;
		}
		for(auto it : cl[x]){
			dfs(dfs, it, lt + (t[x] == 'x' ? nc-1:0), gt+(t[x]=='n'?nc-1:0));
		}
		if(nc==0){
			assert(lt + gt <= n-1);
			num[lt+1]++;
			num[n-gt+1]--;
		}
	};
	dfs(dfs, 1, 0, 0);
	int run=0, ans=0;
	for(int i=1;i<=n;i++){
		run += num[i];
		if(run > 0) ans++;
	}
	cout<<ans;
}
#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...