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>
#include "paint.h"
#include <cstdlib>
using namespace std;
struct BIT{
int N;
vector<int> arr;
BIT(){}
BIT(int n){
N = n + 1;
arr = vector<int> (N);
}
void _u(int i, int val){
while(i < N){
arr[i] += val;
i += (i & (-i));
}
}
void u(int a, int b){
a++;
b++;
_u(b+1,-1);
_u(a,1);
}
int q(int i){
i++;
int s = 0;
while(i > 0){
s += arr[i];
i -= (i & (-i));
}
return s;
}
};
const int MN = 200000;
int N, K;
string S;
vector<int> C;
vector<vector<int>> dp (MN + 10, vector<int> (101, -1));
vector<int> pref (MN), pref2(MN);
BIT bitx, bitw;
int rec(int i1, int i2){
if(dp[i1][i2] != -1) return dp[i1][i2];
if(i2 == K){
dp[i1][i2] = 1;
if(i1 >= N) return 1;
int c = pref2[N-1] - (i1 == 0 ? 0 : pref2[i1-1]);
dp[i1][i2] = c == 0;
if(dp[i1][i2]){
bitw.u(i1,N-1);
}
return dp[i1][i2];
}
dp[i1][i2] = 0;
for(int i = i1; i + C[i2] - 1 < N; i++){
int c = pref[i + C[i2] - 1] - (i == 0 ? 0 : pref[i-1]);
bool b = c == 0;
int t = i + C[i2];
if(b && (t == N || S[t] != 'X') && rec(i + C[i2] + 1, i2+1)){
if(t < N){
bitw.u(t,t);
}
bitx.u(i,i+C[i2]-1);
if(i1<i) bitw.u(i1,i-1);
for(int j = i1; j <= i; j++){
dp[j][i2] = 1;
}
}
if(S[i] == 'X') break;
}
//cout << i1 << " " << i2 << " " << dp[i1][i2] << endl;
return dp[i1][i2];
}
string solve_puzzle(string _s, vector<int> _c) {
//cout << "input: " << _s << endl;
S = _s;
C = _c;
//for(auto e : C) cout << e << " ";
//cout << endl;
N = S.length();
K = C.size();
pref[0] = (S[0] == '_');
for(int i = 1; i < N; i++){
pref[i] = pref[i-1] + (S[i] == '_');
}
pref2[0] = (S[0] == 'X');
for(int i = 1; i < N; i++){
pref2[i] = pref2[i-1] + (S[i] == 'X');
}
bitx = BIT(N);
bitw = BIT(N);
rec(0, 0);
string res (N, '?');
for(int i = 0; i < N; i++){
/*if(S[i] == 'X') x[i] = 1;
else if(S[i] == '_') w[i] = 1;
if(w[i] == 0 && x[i] == 0) w[i] = 1;*/
int tx = bitx.q(i);
int tw = bitw.q(i);
if(tx > 0 && tw == 0) res[i] = 'X';
else if(tx == 0 && tw > 0) res[i] = '_';
}
return res;
}
# | 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... |