Submission #673404

#TimeUsernameProblemLanguageResultExecution timeMemory
673404Farhan_HYRetro (COCI17_retro)C++14
5 / 100
94 ms143436 KiB
#include<bits/stdc++.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define T int t;cin >> t;while(t--) #define int long long #define F first #define S second using namespace std; const int mod = 1e9 + 7; const int N = 1e6 + 6; int n, m, dp2[100][100][100]; bool vis[100][100][100]; string s[N], dp[100][100][100]; int can(int i, int j, int k) { if (i == 1) return k == 0; if (k == 0 && i != n) { if (j - 1 > 0 && s[i - 1][j - 1] == '*') return 1; if (s[i - 1][j] == '*') return 1; if (j + 1 <= m && s[i - 1][j + 1] == '*') return 1; } int &ret = dp2[i][j][k]; if (ret != -1) return ret; ret = 0; if (j - 1 > 0 && s[i - 1][j - 1] != '*') { if (s[i - 1][j - 1] == '(') ret |= can(i - 1, j - 1, k + 1); else if (s[i - 1][j - 1] == ')' && k > 0) ret |= can(i - 1, j - 1, k - 1); else if (s[i - 1][j - 1] == '.') ret |= can(i - 1, j - 1, k); } if (j + 1 <= m && s[i - 1][j + 1] != '*') { if (s[i - 1][j + 1] == '(') ret |= can(i - 1, j + 1, k + 1); else if (s[i - 1][j + 1] == ')' && k > 0) ret |= can(i - 1, j + 1, k - 1); else if (s[i - 1][j + 1] == '.') ret |= can(i - 1, j + 1, k); } if (s[i - 1][j] != '*') { if (s[i - 1][j] == '(') ret |= can(i - 1, j, k + 1); else if (s[i - 1][j] == ')' && k > 0) ret |= can(i - 1, j, k - 1); else if (s[i - 1][j] == '.') ret |= can(i - 1, j, k); } return ret; } string Rec(int i, int j, int k) { if (i == 1) return ""; string &ret = dp[i][j][k]; ret = 'a'; if (k == 0 && i != n) { if (j - 1 > 0 && s[i - 1][j - 1] == '*') ret = ""; if (s[i - 1][j] == '*') ret = ""; if (j + 1 <= m && s[i - 1][j + 1] == '*') ret = ""; } if (vis[i][j][k]) return ret; vis[i][j][k] = 1; if (j - 1 > 0 && s[i - 1][j - 1] != '*') { if (s[i - 1][j - 1] == ')' && k > 0 && can(i - 1, j - 1, k - 1)) ret = min(ret, ')' + Rec(i - 1, j - 1, k - 1)); else if (s[i - 1][j - 1] == '(' && can(i - 1, j - 1, k + 1)) ret = min(ret, '(' + Rec(i - 1, j - 1, k + 1)); else if (s[i][j - 1] == '.' && can(i - 1, j - 1, k)) ret = min(ret, Rec(i - 1, j - 1, k)); } if (s[i - 1][j] != '*') { if (s[i - 1][j] == ')' && k > 0 && can(i - 1, j, k - 1)) ret = min(ret, ')' + Rec(i - 1, j, k - 1)); else if (s[i - 1][j] == '(' && can(i - 1, j, k + 1)) ret = min(ret, '(' + Rec(i - 1, j, k + 1)); else if (s[i - 1][j + 1] == '.' && can(i - 1, j, k)) ret = min(ret, Rec(i - 1, j, k)); } if (j + 1 <= m && s[i - 1][j + 1] != '*') { if (s[i - 1][j + 1] == ')' && k > 0 && can(i - 1, j + 1, k - 1)) ret = min(ret, ')' + Rec(i - 1, j + 1, k - 1)); else if (s[i - 1][j + 1] == '(' && can(i - 1, j + 1, k + 1)) ret = min(ret, '(' + Rec(i - 1, j + 1, k + 1)); else if (s[i - 1][j + 1] == '.' && can(i - 1, j + 1, k)) ret = min(ret, Rec(i - 1, j + 1, k)); } return ret; } main() { cin >> n >> m; for(int i = 1; i <= n; i++) cin >> s[i], s[i] = '.' + s[i]; string ans; memset(dp2, -1, sizeof dp2); for(int j = 1; j <= m; j++) { if (s[n][j] == 'M') { ans = Rec(n, j, 0); } } cout << ans.size() << '\n' << ans; }

Compilation message (stderr)

retro.cpp:80:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   80 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...