Submission #236147

# Submission time Handle Problem Language Result Execution time Memory
236147 2020-05-31T09:44:33 Z kartel Retro (COCI17_retro) C++14
41 / 100
238 ms 222584 KB
#include <bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define in(x) freopen(x, "r", stdin)
#define out(x) freopen(x, "w", stdout)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-O3")
#define F first
#define S second
#define pb push_back
#define N +100500
#define M ll(1e9 + 7)
#define sz(x) (int)x.size()
#define re return
#define oo ll(1e9)
#define el '\n'
#define pii pair <int, int>
using namespace std;
//using namespace __gnu_pbds;
//typedef tree <int, null_type, less_equal <int> , rb_tree_tag, tree_order_statistics_node_update> ordered_set;
typedef long long ll;
typedef long double ld;

int n, m, i, j, b, B, len, ans, I, J;
char c[305][305];

bool great(string a, string b)
{
  	if (b == "x") return 1;
    if (sz(a) < sz(b)) return 0;
    if (sz(a) > sz(b)) return 1;
    return (a < b);
}

int main()
{
    srand(time(0));
    ios_base::sync_with_stdio(0);
    iostream::sync_with_stdio(0);
    ios::sync_with_stdio(0);
    cin.tie(NULL);
    cout.tie(NULL);

//    in("input.txt");
//    out("output.txt");

    cin >> n >> m;

    if (n * m * 1ll * n * n * n > ll(1e9))
    {
        pair <int, int> f[n + 5][m + 5][n + 5];

        for (i = 1; i <= n; i++)
           for (j = 1; j <= m; j++)
             for (b = 0; b <= 300; b++)
                f[i][j][b].F = -1;

        for (i = 1; i <= n; i++)
          for (j = 1; j <= m; j++)
        {
            cin >> c[i][j];

            if (c[i][j] == 'M') f[i][j][0].F = 0;
        }


        for (i = n; i >= 2; i--)
        {
            for (j = 1; j <= m; j++)
                for (b = 0; b <= 300; b++)
            {
                if (f[i][j][b].F == -1) continue;

                if (j - 1 >= 1 && c[i - 1][j - 1] != '*')
                {
                    int B = b, len = f[i][j][b].F;

                    if (c[i - 1][j - 1] == '(') B++, len++; else
                    if (c[i - 1][j - 1] == ')') B--, len++;

                    if (B >= 0 && (f[i - 1][j - 1][B].F == -1 || f[i - 1][j - 1][B].F < len || (f[i - 1][j - 1][B].F == len && B - b == 1)))
                    {
    //                    cerr << len << " " << i - 1 << " " << j - 1 << " " << B << el;
                        f[i - 1][j - 1][B].F = len;
                        f[i - 1][j - 1][B].S = j;
                    }

                }

                if (j >= 1 && c[i - 1][j] != '*')
                {
                    int B = b, len = f[i][j][b].F;

                    if (c[i - 1][j] == '(') B++, len++; else
                    if (c[i - 1][j] == ')') B--, len++;

                    if (B >= 0 && (f[i - 1][j][B].F == -1 || f[i - 1][j][B].F < len || (f[i - 1][j][B].F == len && B - b == 1)))
                    {
    //                    cerr << len << " " << i - 1 << " " << j << " " << B << el;
                        f[i - 1][j][B].F = len;
                        f[i - 1][j][B].S = j;
                    }

                }

                if (j + 1 <= m && c[i - 1][j + 1] != '*')
                {
                    int B = b, len = f[i][j][b].F;

                    if (c[i - 1][j + 1] == '(') B++, len++; else
                    if (c[i - 1][j + 1] == ')') B--, len++;

                    if (B >= 0 && (f[i - 1][j + 1][B].F == -1 || f[i - 1][j + 1][B].F < len || (f[i - 1][j + 1][B].F == len && B - b == 1)))
                    {
    //                    cerr << len << " " << i - 1 << " " << j + 1 << " " << B << el;
                        f[i - 1][j + 1][B].F = len;
                        f[i - 1][j + 1][B].S = j;
                    }
                }
            }
        }

        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= m; j++)
            {
                if (i == 1 || c[i - 1][j] == '*' || (j - 1 >= 1 && c[i - 1][j - 1] == '*') || (j + 1 <= m && c[i - 1][j + 1] == '*'))
                {
                    if (ans < f[i][j][0].F)
                        ans = f[i][j][0].F, I = i, J = j;
                }
            }
        }

        string s = "";

        cout << ans << el;

        b = 0;

        while (I != n)
        {
            int nb = b;

            if (c[I][J] != '.')
            {
                if (c[I][J] == ')') nb++;
                               else nb--;
                s += c[I][J];
            }

            J = f[I][J][b].S;
            I++;

            b = nb;
        }

        reverse(s.begin(), s.end());

        cout << s;
    }
    else
    {
        string F[n + 5][m + 5][305];

        for (i = 1; i <= n; i++)
           for (j = 1; j <= m; j++)
             for (b = 0; b <= 300; b++)
                F[i][j][b] = "", F[i][j][b] += "x";

        for (i = 1; i <= n; i++)
          for (j = 1; j <= m; j++)
        {
            cin >> c[i][j];
            if (c[i][j] == 'M') F[i][j][0] = "";
        }


        for (i = n; i >= 2; i--)
        {
            for (j = 1; j <= m; j++)
                for (b = 0; b <= 300; b++)
            {
                if (F[i][j][b] == "x") continue;
                cerr << i << " " << j << " " << b << " " << F[i][j][b] << el;

                if (j - 1 >= 1 && c[i - 1][j - 1] != '*')
                {
                    int B;B = b;
                    string x = F[i][j][b];

                    if (c[i - 1][j - 1] == '(') x += "(", B++; else
                    if (c[i - 1][j - 1] == ')') x += ")", B--;

                    if (B >= 0 && great(x, F[i - 1][j - 1][B]))
                    {
                        //cout << i << " " << j << " " << B << " " << b << " " << F[i][j][b] << " " << F[i - 1][j - 1][B] << el;
//    //                    cerr << len << " " << i - 1 << " " << j - 1 << " " << B << el;
                        F[i - 1][j - 1][B] = x;
                    }

                }

                if (j >= 1 && c[i - 1][j] != '*')
                {
                    int B = b;

                    string x = F[i][j][b];

                    if (c[i - 1][j] == '(') x += "(", B++; else
                    if (c[i - 1][j] == ')') x += ")", B--;

                    if (B >= 0 && great(x, F[i - 1][j][B]))
                    {
//                        cerr << F[i][j][b] << " " << F[i - 1][j][B] << el;
    //                    cerr << len << " " << i - 1 << " " << j << " " << B << el;
                        F[i - 1][j][B] = x;
                    }

                }

                if (j + 1 <= m && c[i - 1][j + 1] != '*')
                {
                    int B = b;

                    string x = F[i][j][b];

                    if (c[i - 1][j + 1] == '(') x += "(", B++; else
                    if (c[i - 1][j + 1] == ')') x += ")", B--;

                    if (B >= 0 && great(x, F[i - 1][j + 1][B]))
                    {
//                        cerr << F[i][j][b] << " " << F[i - 1][j + 1][B] << el;
                        F[i - 1][j + 1][B] = x;
                    }
                }
            }
        }
        string s = "";
        for (i = 1; i <= n; i++)
        {
            for (j = 1; j <= m; j++)
            {
                if (i == 1 || c[i - 1][j] == '*' || (j - 1 >= 1 && c[i - 1][j - 1] == '*') || (j + 1 <= m && c[i - 1][j + 1] == '*'))
                {
                    if (great(F[i][j][0], s))
                        s = F[i][j][0];
                }
            }
        }
//        s.erase(0, 1);
        cout << sz(s) << el << s;
    }
 }

//
//110000
//1100
# Verdict Execution time Memory Grader output
1 Correct 7 ms 1920 KB Output is correct
2 Correct 13 ms 4608 KB Output is correct
3 Correct 13 ms 3072 KB Output is correct
4 Correct 17 ms 6016 KB Output is correct
5 Correct 41 ms 20352 KB Output is correct
6 Incorrect 17 ms 3456 KB Token "
7 Incorrect 19 ms 5504 KB Token "
8 Incorrect 13 ms 3456 KB Token "
9 Incorrect 22 ms 7040 KB Token "
10 Incorrect 26 ms 9472 KB Token "
11 Incorrect 238 ms 195064 KB Token "
12 Incorrect 224 ms 195192 KB Token "
13 Partially correct 95 ms 91896 KB Partially correct
14 Partially correct 89 ms 91768 KB Partially correct
15 Partially correct 219 ms 220408 KB Partially correct
16 Partially correct 213 ms 220408 KB Partially correct
17 Partially correct 191 ms 186252 KB Partially correct
18 Partially correct 172 ms 186232 KB Partially correct
19 Partially correct 224 ms 222456 KB Partially correct
20 Partially correct 204 ms 222584 KB Partially correct