Submission #991880

#TimeUsernameProblemLanguageResultExecution timeMemory
991880danikoynovSecurity Gate (JOI18_security_gate)C++14
30 / 100
4187 ms568 KiB
#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const ll mod = 1000000007;

int n;
string s;

const int maxn = 310;

int max_val[maxn][maxn];
int pref[maxn];
void solve()
{
    cin >> n >> s;
    s = "#" + s;
    int cnt = 0;
    for (int i = 1; i <= n; i ++)
    {
        if (s[i] == 'x')
            cnt ++;
    }

    int res = 0;
    for (int mask = 0; mask < (1 << cnt); mask ++)
    {
        int bit = 0;
        string t = s;
        for (int i = 1; i <= n; i ++)
        {
            if (t[i] == 'x')
            {
                //cout << "here " << mask << " " << bit << " " << (mask & (1 << bit)) << endl;
                if ((mask & (1 << bit)) > 0)
                    t[i] = '(';
                else
                    t[i] = ')';
                bit ++;
            }
        }


        bool done = false;
        for (int i = 1; i <= n; i ++)
        {
            pref[i] = pref[i - 1];
            if (t[i] == '(')
                    pref[i] ++;
            else
                pref[i] --;
        }
        if (abs(pref[n]) % 2 == 1)
        {
            continue;
        }


        int d = pref[n];

        int lf = 1;
        while(lf <= n && pref[lf] >= 0)
            lf ++;
        lf --;

        int rf = n;
        while(rf > 0 && pref[rf] - d >= 0)
            rf --;

        for (int i = 1; i <= n; i ++)
        {
            int x = pref[i];
            for (int j = i; j <= n; j ++)
            {
                x = max(x, pref[j]);
                max_val[i][j] = x;
            }
        }


        for (int r = n; r >= rf - 1 && !done; r --)
        {
            for (int l = 1; l <= lf + 1; l ++)
            {
                ///cout << "HERE " << l << " " << r << endl;
                if (pref[r] - pref[l - 1] != d / 2)
                    continue;
                int val = max_val[l][r] - pref[l - 1];
                val = -val;
                val = val + pref[l - 1];
                if (val >= 0)
                {
                    done = true;
                    break;
                }
            }
        }
        bool tf = true;
        for (int d = 1; d <= n; d ++)
        {
            if (pref[d] < 0)
            {
                tf = false;
                break;
            }
        }
        if (pref[n] != 0)
            tf = false;
        if (tf)
        {
            ///cout << i << " : " << j << endl;
            done = true;
        }
        if (done)
            res ++;

        //cout << t << " " << done << endl;
        //cout << lf << " " << rf << endl;
    }
    cout << res << endl;
}

int main()
{
    speed();
    solve();
    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...