이 제출은 이전 버전의 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... |