답안 #236145

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
236145 2020-05-31T09:38:52 Z kartel Retro (COCI17_retro) C++14
41 / 100
235 ms 222712 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][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[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 <= n / 2; b++)
            {
                if (f[i][j][b] == "x") continue;
//                cout << 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
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 6 ms 640 KB Output is correct
3 Correct 5 ms 512 KB Output is correct
4 Correct 7 ms 640 KB Output is correct
5 Correct 14 ms 1664 KB Output is correct
6 Incorrect 17 ms 3456 KB Token "
7 Incorrect 19 ms 5504 KB Token "
8 Incorrect 12 ms 3584 KB Token "
9 Incorrect 22 ms 7040 KB Token "
10 Incorrect 26 ms 9472 KB Token "
11 Incorrect 235 ms 195068 KB Token "
12 Incorrect 224 ms 195192 KB Token "
13 Partially correct 92 ms 91640 KB Partially correct
14 Partially correct 90 ms 91640 KB Partially correct
15 Partially correct 208 ms 220280 KB Partially correct
16 Partially correct 200 ms 220392 KB Partially correct
17 Partially correct 182 ms 186104 KB Partially correct
18 Partially correct 170 ms 186104 KB Partially correct
19 Partially correct 228 ms 222588 KB Partially correct
20 Partially correct 203 ms 222712 KB Partially correct