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 <bits/stdc++.h>
using namespace std;
#ifndef HOME
#include "paint.h"
#endif
const int MAX_N = 200000;
const int MAX_K = 100;
int white[1+MAX_N];
bool pref[1+MAX_K][1+MAX_N];
bool suff[1+MAX_K][1+MAX_N];
int smen[1+MAX_N+1];
void calcdp(int n, int k, string clues, vector<int> block, bool dp[1+MAX_K][1+MAX_N]) {
dp[0][0] = true;
for(int i = 1; i <= n; ++i)
white[i] = white[i - 1] + (clues[i] == '_');
for(int i = 1; i <= n; ++i) {
if(clues[i] == 'X')
dp[0][i] = false;
else
dp[0][i] = dp[0][i - 1];
}
for(int j = 1; j <= k; ++j) {
for(int i = block[j]; i <= n; ++i)
if(clues[i] == '_')
dp[j][i] = dp[j][i - 1];
else if(clues[i] == 'X' && clues[i - block[j]] != 'X' && white[i] - white[i - block[j]] == 0)
dp[j][i] = dp[j - 1][max(i - block[j] - 1, 0)];
else if(clues[i] == '.') {
dp[j][i] = dp[j][i - 1];
if(white[i] - white[i - block[j]] == 0 && clues[i - block[j]] != 'X')
dp[j][i] |= dp[j - 1][max(i - block[j] - 1, 0)];
}
}
}
string solve_puzzle(string clues, vector<int> block) {
int n, k;
n = clues.size();
k = block.size();
clues.insert(clues.begin(), 0);
block.insert(block.begin(), 0);
string result(n, '.');
calcdp(n, k, clues, block, pref);
reverse(clues.begin() + 1, clues.end());
reverse(block.begin() + 1, block.end());
calcdp(n, k, clues, block, suff);
reverse(clues.begin() + 1, clues.end());
reverse(block.begin() + 1, block.end());
clues.push_back('.');
/*for(int j = 0; j <= k; ++j) {
for(int i = 1; i <= n; ++i)
printf("%d ", pref[j][i]);
printf("\n");
}
printf("\n");
for(int j = 0; j <= k; ++j) {
for(int i = 1; i <= n; ++i)
printf("%d ", suff[j][i]);
printf("\n");
}
printf("\n");
*/
for(int i = 0; i <= k; ++i)
for(int j = 1; j <= n; ++j) {
if(clues[j] != 'X' && pref[i][j - 1] && suff[k - i][max(n - j, 0)])
result[j - 1] = '_';
}
for(int i = 1; i <= n; ++i)
white[i] = white[i - 1] + (clues[i] == '_');
for(int j = 1; j <= k; ++j) {
for(int i = block[j]; i <= n; ++i) {
if(white[i] - white[i - block[j]] == 0 && // ultima bucata nu are restrictii albe
clues[i + 1] != 'X' &&
clues[i - block[j]] != 'X' &&
pref[j - 1][max(i - block[j] - 1, 0)] &&
suff[k - j][max(n - i - 1, 0)]) {
// printf("Put block %d: %d <-> %d\n", j, i - block[j] + 1, i);
smen[i - block[j] + 1]++;
smen[i + 1]--;
}
}
}
int p = 0;
for(int i = 1; i <= n; ++i) {
p += smen[i];
if(p > 0 && result[i - 1] == '_')
result[i - 1] = '?';
else if(p > 0)
result[i - 1] = 'X';
}
return result;
}
#ifdef HOME
int main() {
#ifdef HOME
FILE *fin = fopen("input.in", "r");
FILE *fout = fopen("output.out", "w");
#else
FILE *fin = stdin;
FILE *fout = stdout;
#endif
const int S_MAX_LEN = 200 * 1000;
char buf[S_MAX_LEN + 1];
assert(1 == fscanf(fin, "%s", buf));
std::string s = buf;
int c_len;
assert(1 == fscanf(fin, "%d", &c_len));
std::vector<int> c(c_len);
for (int i = 0; i < c_len; i++) {
assert(1 == fscanf(fin, "%d", &c[i]));
}
std::string ans = solve_puzzle(s, c);
fprintf(fout, "%s\n", ans.data());
#ifdef HOME
fclose(fin);
fclose(fout);
#endif
return 0;
}
#endif
# | 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... |