Submission #236132

#TimeUsernameProblemLanguageResultExecution timeMemory
236132kartelRetro (COCI17_retro)C++14
17 / 100
484 ms524288 KiB
#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 * 300 * 300 * 4 > 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 - 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 << " " << 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
#Verdict Execution timeMemoryGrader output
Fetching results...