제출 #1307093

#제출 시각아이디문제언어결과실행 시간메모리
1307093simona1230Homework (CEOI22_homework)C++20
23 / 100
592 ms17468 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=0;
                if(a[i]==1)
                {
                    int m1=g,m2=g;
                    for(int j=0;j<g;j++)
                    {
                        if(dp[v1][b1]&(1<<j))
                            m1=min(m1,j);
                        if(dp[v2][b2]&(1<<j))
                            m2=min(m2,j);
                    }

                    for(int j=0;j<=min(m1,m2);j++)
                    {
                        if((1<<j)&dp[v1][b1])
                            curr+=(1<<j);
                        if((1<<j)&dp[v2][b2])
                            curr+=(1<<j);
                    }
                }
                else
                {
                    int m1=0,m2=0;
                    for(int j=0;j<g;j++)
                    {
                        if(dp[v1][b1]&(1<<j))
                            m1=max(m1,j);
                        if(dp[v2][b2]&(1<<j))
                            m2=max(m2,j);
                    }

                    for(int j=max(m1,m2);j<g;j++)
                    {
                        if((1<<j)&dp[v1][b1])
                            curr+=(1<<j);
                        if((1<<j)&dp[v2][b2])
                            curr+=(1<<j);
                    }
                }

                dp[i][b]|=curr;*/

                for(int g1=0;g1<g;g1++)
                {
                    for(int g2=0;g2<g;g2++)
                    {
                        if(dp[v1][b1]&(1<<g1))
                            if(dp[v2][b2]&(1<<g2))
                        {
                            int f=min(g1,g2);
                            if(a[i]==1)f=max(g1,g2);
                            dp[i][b]|=(1<<f);
                        }
                    }
                }
            }
        }
    }
    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...