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 <iostream>
#include <vector>
#include <string>
#include <cassert>
using namespace std;
#define rep(i, n) for (int i=0; i<(n); i++)
int N, K;
int C[100];
bool dp[100001][101];
int white[100001], black[100001];
inline int range_white(int l, int r) { return white[r]-(l>0?white[l-1]:0); }
inline int range_black(int l, int r) { return black[r]-(l>0?black[l-1]:0); }
bool f(string S) {
rep(i, N+1) rep(j, K+1) dp[i][j] = false;
rep(i, N) white[i] = S[i]=='_', black[i] = S[i]=='X';
rep(i, N-1) white[i+1] += white[i], black[i+1] += black[i];
dp[0][0] = true;
rep(i, N) {
if (range_black(i, i)) continue;
rep(k, K+1) dp[i+1][k] |= dp[i][k];
rep(k, K) {
int l = i-C[k];
if (range_white(l, i-1) == 0) dp[i+1][k+1] |= dp[l][k];
}
}
return dp[N][K];
}
string solve_puzzle(string S, vector<int> c) {
S += '_';
N = S.length();
K = c.size();
rep(i, K) C[i] = c[i];
string O(S);
assert(f(S));
rep(i, N) {
if (S[i] != '.') continue;
S[i] = 'X';
if (!f(S)) {
O[i] = '_';
}
else {
S[i] = '_';
if (!f(S)) {
O[i] = 'X';
}
else {
O[i] = '?';
}
}
S[i] = '.';
}
O.pop_back();
return O;
}
# | 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... |