이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "paint.h"
#ifdef NYAOWO
#include "grader.cpp"
#endif
#include <bits/stdc++.h>
#define For(i, a, b) for(int i = a; i <= b; i++)
#define Forr(i, a, b) for(int i = a; i >= b; i--)
#define F first
#define S second
#define eb emplace_back
#define all(x) x.begin(), x.end()
#define sz(x) ((int)x.size())
// #define int LL
using namespace std;
using LL = long long;
using pii = pair<int, int>;
const int MAXN = 200'000;
const int MAXK = 100;
int dp[MAXK + 10][MAXN + 10];
int last_white[MAXN + 10];
int last_black[MAXN + 10];
int owo[MAXN + 10];
int tag[MAXN + 10]; // 0 = no, 1 = white, 2 = black, 1|2 = both
string solve_puzzle(string s, vector<int32_t> c) {
s = '_' + s;
int n = sz(s);
int k = sz(c);
memset(dp , 0, sizeof(dp ));
memset(tag, 0, sizeof(tag));
// build table for next/previous white/black cells
last_white[0] = last_black[0] = 0;
For(i, 1, n) {
if(s[i - 1] == 'X') last_black[i] = i;
else last_black[i] = last_black[i - 1];
if(s[i - 1] == '_') last_white[i] = i;
else last_white[i] = last_white[i - 1];
}
// walk from beginning
For(i, 0, n) {
if(i && last_black[i] == i) break;
dp[0][i] = 1;
}
For(j, 1, k) {
int len = c[j - 1];
For(i, 1, n) {
if(i >= len &&
i - last_white[i] >= len &&
last_black[i - len] != i - len &&
dp[j - 1][i - len - 1]) {
dp[j][i] |= 2;
}
if(last_black[i] != i &&
dp[j][i - 1]) {
dp[j][i] |= 1;
}
}
}
// restore transitions
dp[k][n] |= 4;
Forr(j, k, 0) {
int len = j ? c[j - 1] : 0;
Forr(i, n, 2) if(dp[j][i] & 4) {
if(dp[j][i] & 2) {
dp[j - 1][i - len - 1] |= 4;
owo[i - len + 1] = max(owo[i - len + 1], len);
tag[i - len] |= 1;
}
if(dp[j][i] & 1) {
dp[j][i - 1] |= 4;
tag[i] |= 1;
}
}
}
int now = 0;
For(i, 1, n) {
now = max(now - 1, owo[i]);
if(now) tag[i] |= 2;
}
string ans;
For(i, 2, n) {
if(tag[i] == 3) ans.push_back('?');
if(tag[i] == 2) ans.push_back('X');
if(tag[i] == 1) ans.push_back('_');
}
return ans;
}
# | 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... |