This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
string S;
int N, K;
vector<int> C;
vector<int> pref_white, pref_black;
vector<int> ans; //0 = undetermined, 1 = white, 2 = black, 3 = can be both
vector<vector<vector<int>>> memo;
inline bool check_white(int le, int ri) { //get number of white spaces in le...ri
if (ri >= N) return false;
if (le > ri) return true;
int res = pref_white[ri];
if (le > 0) res -= pref_white[le - 1];
return (res == 0);
}
inline bool check_black(int le, int ri) { //get number of black spaces in le...ri
if (ri >= N) return false;
if (le > ri) return true;
int res = pref_black[ri];
if (le > 0) res -= pref_black[le - 1];
return (res == 0);
}
bool dp(int n, int k, int last_black) {
if (k == K) {
if (check_black(n, N - 1)) {
for (int i = n; i < N; i++) ans[i] |= 1;
return true;
}
return false;
}
if (n == N) return false;
if (memo[n][k][last_black] != -1) return memo[n][k][last_black];
//if S[n] != '.', already determined. go next
//assume S[n] = 'X' and '_'. if noth possible, '?'. 4 possibilities
bool res_ = false, resX = false;
if (S[n] == '_') {
ans[n] |= 1;
return memo[n][k][last_black] = dp(n + 1, k, 0);
} else if (S[n] == 'X') {
if (!last_black && check_white(n, n + C[k] - 1)) {
bool res = dp(n + C[k], k + 1, 1);
if (res) for (int i = n; i < n + C[k]; i++) ans[i] |= 2;
return memo[n][k][last_black] = res;
} else {
return memo[n][k][last_black] = false;
}
}
res_ = dp(n + 1, k, 0);
if (!last_black && check_white(n, n + C[k] - 1)) resX = dp(n + C[k], k + 1, 1);
if (res_) ans[n] |= 1;
if (resX) for (int i = n; i < n + C[k]; i++) ans[i] |= 2;
return memo[n][k][last_black] = (res_ || resX);
}
string solve_puzzle(string s, vector<int> c) {
S = s;
N = s.size();
K = c.size();
C = c;
pref_white.resize(N);
pref_black.resize(N);
ans.resize(N);
memo.assign(N, vector<vector<int>>(K, vector<int>(2, -1)));
for (int i = 0; i < N; i++) {
pref_white[i] = (S[i] == '_')? 1 : 0;
if (i > 0) pref_white[i] += pref_white[i - 1];
pref_black[i] = (S[i] == 'X')? 1 : 0;
if (i > 0) pref_black[i] += pref_black[i - 1];
if (S[i] == '.') {
ans[i] = 0;
} else if (S[i] == '_') {
ans[i] = 1;
} else if (S[i] == 'X') {
ans[i] = 2;
}
}
dp(0, 0, 0);
string res;
for (int i = 0; i < N; i++) {
if (ans[i] == 0) {
res.push_back('E');
} else if (ans[i] == 1) {
res.push_back('_');
} else if (ans[i] == 2) {
res.push_back('X');
} else {
res.push_back('?');
}
}
return res;
}
Compilation message (stderr)
paint.cpp: In function 'bool dp(int, int, int)':
paint.cpp:48:39: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
return memo[n][k][last_black] = dp(n + 1, k, 0);
paint.cpp:53:43: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
return memo[n][k][last_black] = res;
paint.cpp:55:43: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
return memo[n][k][last_black] = false;
paint.cpp:65:35: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
return memo[n][k][last_black] = (res_ || resX);
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |