이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "paint.h"
#include <iostream>
#include<string>
#include<vector>
#define MAXN 200005
#define MAXK 105
using namespace std;
int N, K, whitesum[MAXN], canblack[MAXN], black;
bool dp[MAXN][MAXK], done[MAXN][MAXK], canwhite[MAXN];
string s;
vector <int> c;
bool gen(int i, int j) {
if (i >= N && j == K) {return(1);}
if (i >= N && j < K) {return(0);}
if (done[i][j]) {return(dp[i][j]);}
done[i][j]=true;
if (s[i] != 'X' && gen(i+1,j)) {
dp[i][j]=true;
canwhite[i]=true;
}
if (j < K && i + c[j] <= N) {
bool can = true;
if (whitesum[i+c[j]] - whitesum[i] > 0 || (i+c[j] != N && s[i+c[j]] == 'X')) {
can=false;
}
if (can && gen(i+c[j]+1, j+1)) {
dp[i][j]=true;
canblack[i]++;
canblack[i+c[j]]--;
canwhite[i+c[j]]=true;
}
}
return(dp[i][j]);
}
string solve_puzzle(string S, vector<int> C) {
N=S.size(), K=C.size();
s = S, c = C;
for (int i=1; i<=N; i++) {
whitesum[i]=whitesum[i-1] + (S[i-1] == '_');
}
gen(0,0);
string Sol;
for (int i=0; i<N; i++) {
black+=canblack[i];
if (black && canwhite[i]) {
Sol.push_back('?');
} else if (black) {
Sol.push_back('X');
} else {
Sol.push_back('_');
}
}
return(Sol);
}
# | 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... |