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>
#define maxn (int)(1e5+51)
#define all(x) x.begin(), x.end()
#define sz(x) (int) x.size()
#define endl '\n'
#define ll long long
#define pb push_back
#define ull unsigned long long
#define ii pair<int,int>
#define iii tuple<int,int,int>
#define inf 2000000001
#define mod 1000000007 //998244353
#define _ ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#include "paint.h"
using namespace std;
template<typename X, typename Y> bool ckmin(X& x, const Y& y) { return (y < x) ? (x=y,1):0; }
template<typename X, typename Y> bool ckmax(X& x, const Y& y) { return (x < y) ? (x=y,1):0; }
int pr1[2*maxn], pr2[2*maxn],pr3[2*maxn][101];
bool dp1[2*maxn][101], dp2[2*maxn][101],no[2*maxn],yes[2*maxn];
string solve_puzzle(string s,vector<int> c){
int n = sz(s), k = sz(c);
c.insert(begin(c),0);
for(int i=0;i<n;++i){
pr1[i+1] = pr1[i], pr2[i+1] = pr2[i];
pr1[i+1] += s[i]=='_', pr2[i+1] += s[i]=='X';
}
dp1[0][0] = dp2[0][0] = 1;
for(int j=0;j<=k;++j){
for(int i=1;i<=n;++i){
if(j==0){
dp1[i][j] = pr2[i]==0;
}else{
if(s[i-1]=='_'){
dp1[i][j] = dp1[i-1][j];
}else if(s[i-1]=='X'){
if(c[j]>i)dp1[i][j] = 0;
else if(c[j]==i)dp1[i][j] = (pr1[i]==0&&j==1);
else dp1[i][j] = (!(pr1[i]-pr1[i-c[j]])&&s[i-c[j]-1]!='X'&&dp1[i-c[j]-1][j-1]);
}else{
dp1[i][j] = dp1[i-1][j];
if(c[j]>i)dp1[i][j] |= 0;
else if(c[j]==i)dp1[i][j] |= (pr1[i]==0&&j==1);
else dp1[i][j] |= (!(pr1[i]-pr1[i-c[j]])&&s[i-c[j]-1]!='X'&&dp1[i-c[j]-1][j-1]);
}
}
}
}
for(int j=0;j<=k;++j){
for(int i=1;i<=n;++i){
int revi = n - i + 1, revj = k - j + 1;
if(j==0)dp2[i][j] = (pr2[n] - pr2[revi-1]==0);
else{
if(s[revi-1]=='_')dp2[i][j] = dp2[i-1][j];
if(s[revi-1]=='X'){
if(c[revj]>i)dp2[i][j] = 0;
else if(c[revj]==i)dp2[i][j] = (pr1[n]-pr1[revi-1]==0&&j==1);
else dp2[i][j]=(pr1[revi+c[revj]-1]-pr1[revi-1]==0&&
s[revi+c[revj]]!='X'&&dp2[i-c[revj]-1][j-1]);
}else{
dp2[i][j] = dp2[i-1][j];
if(c[revj]>i)dp2[i][j] |= 0;
else if(c[revj]==i)dp2[i][j] |= (pr1[n]-pr1[revi-1]==0&&j==1);
else dp2[i][j]|=(pr1[revi+c[revj]-1]-pr1[revi-1]==0&&
s[revi+c[revj]]!='X'&&dp2[i-c[revj]-1][j-1]);
}
}
}
}
// for(int j=0;j<=k;++j){
// for(int i=1;i<=n;++i){
// cout<<dp1[i][j]<<" \n"[i==n];
// }
// }
// for(int j=0;j<=k;++j){
// for(int i=1;i<=n;++i){
// cout<<dp2[i][j]<<" \n"[i==n];
// }
// }
for(int i=1;i<=n;++i)
for(int j=0;j<=k;++j)
no[i]|=dp1[i-1][j]&&dp2[n-i][k-j]&&s[i-1]!='X';
// for(int i=1;i<=n;++i)cout<<no[i]<<" \n"[i==n];
for(int j=1;j<=k;++j){
for(int i=c[j]+j!=1;i<=n;++i){
pr3[i][j] = pr3[i-1][j];
if(j==1&&i==c[j]){
if(dp2[n-c[j]-1][k-1]&&s[c[j]]!='X'&&pr1[i]==0)pr3[i][j]++;
}else{
if(dp1[i-c[j]-1][j-1]&&(i!=n?dp2[n-i-1][k-j]:j==k)
&&s[i]!='X'&&s[i-c[j]-1]!='X'&&pr1[i]-pr1[i-c[j]]==0)
pr3[i][j]++;
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=k;++j){
yes[i]|=(pr3[min(n,i+c[j]-1)][j]-pr3[i-1][j]);
}
}
// for(int j=1;j<=k;++j){
// for(int i=1;i<=n;++i)
// cout<<pr3[i][j]<<" \n"[i==n];
// }
// for(int i=1;i<=n;++i)cout<<yes[i]<<" "<<no[i]<<endl;
for(int i=0;i<n;++i){
if(s[i]=='.'){
if(yes[i+1]&&no[i+1])s[i]='?';
else if(yes[i+1])s[i]='X';
else s[i]='_';
}
}
return s;
}
// int main(){
// string s;int k;cin>>s>>k;
// vector<int>c(k);
// for(auto& x:c)cin>>x;
// cout<<solve_puzzle(s,c);
// }
# | 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... |