답안 #236139

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
236139 2020-05-31T09:19:35 Z kartel Retro (COCI17_retro) C++14
16 / 100
239 ms 222596 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 (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][n + 5];

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

        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] == "") continue;

                if (j - 1 >= 1 && 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 << len << " " << i - 1 << " " << j - 1 << " " << B << el;
                        f[i - 1][j - 1][B] = len;
                    }

                }

                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 << 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 << len << " " << 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
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 384 KB Output isn't correct
2 Incorrect 10 ms 640 KB Output isn't correct
3 Incorrect 8 ms 512 KB Output isn't correct
4 Incorrect 12 ms 768 KB Output isn't correct
5 Incorrect 18 ms 1664 KB Output isn't correct
6 Incorrect 17 ms 3456 KB Token "
7 Incorrect 19 ms 5504 KB Token "
8 Incorrect 12 ms 3584 KB Token "
9 Incorrect 23 ms 7040 KB Token "
10 Incorrect 26 ms 9472 KB Token "
11 Incorrect 239 ms 195148 KB Token "
12 Incorrect 219 ms 195064 KB Token "
13 Partially correct 93 ms 91640 KB Partially correct
14 Partially correct 92 ms 91768 KB Partially correct
15 Partially correct 214 ms 220280 KB Partially correct
16 Partially correct 201 ms 220280 KB Partially correct
17 Partially correct 181 ms 186076 KB Partially correct
18 Partially correct 170 ms 186104 KB Partially correct
19 Partially correct 220 ms 222596 KB Partially correct
20 Partially correct 207 ms 222584 KB Partially correct