Submission #1307070

#TimeUsernameProblemLanguageResultExecution timeMemory
1307070simona1230Homework (CEOI22_homework)C++20
0 / 100
22 ms17420 KiB
#include <bits/stdc++.h>

using namespace std;
string s;
int a[200001];
vector<int> v[200001];
int num=0,g;
void build()
{
    stack<int> h;
    for(int i=0;i<s.size();i++)
    {
        int tp=0;
        if(s[i]=='m')
        {
            if(s[i+1]=='i')a[++num]=-1;
            else a[++num]=1;

            if(h.size())
                v[h.top()].push_back(num);
            h.push(num);
        }

        if(s[i]==')')
            h.pop();

        if(s[i]=='?')
        {
            num++;
            g++;
            v[h.top()].push_back(num);
        }
    }

    /*for(int i=1;i<=num;i++)
    {
        cout<<i<<": ";
        for(auto j:v[i])
            cout<<j<<" ";
                cout<<endl;
    }*/
}

int cnt[200001];
int dp[1024][100001];
vector<int> p[100001];

void prec()
{
    for(int i=0;i<(1<<g);i++)
    {
        p[__builtin_popcount(i)].push_back(i);
    }
}

void dfs(int i)
{
    for(auto j:v[i])
    {
        dfs(j);
        cnt[i]+=cnt[j];
    }

    if(v[i].size())
    {
        int v1=v[i][0];
        int v2=v[i][1];

        for(auto b1:p[cnt[v1]])
        {
            for(auto b2:p[cnt[v2]])
            {
                if(b1&b2)continue;
                int b=b1+b2;

                int curr=(dp[v1][b1]|dp[v2][b2]);
                if(a[i]==-1)
                {
                    for(int j=g;j>=0;j--)
                    {
                        if(curr&(1<<j))
                        {
                            curr-=(1<<j);
                            break;
                        }
                    }
                }
                else
                {
                    for(int j=0;j<=g;j++)
                    {
                        if(curr&(1<<j))
                        {
                            curr-=(1<<j);
                            break;
                        }
                    }
                }

                dp[i][b]|=curr;
            }
        }
    }
    else
    {
        cnt[i]=1;
        for(int j=0;j<g;j++)
            dp[i][(1<<j)]=(1<<j);
    }
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>s;
	build();
	prec();
	dfs(1);

	/*for(int i=1;i<=num;i++)
    {
        for(auto j:p[cnt[i]])
            cout<<i<<" "<<j<<" : "<<dp[i][j]<<endl;
    }*/
	cout<<__builtin_popcount(dp[1][(1<<g)-1])<<endl;
	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...