#include "paint.h"
#include <bits/stdc++.h>
using namespace std;
bool dp1[200001][101],dp2[200001][101],vis[200001][101];
int siz[101],pre[200001][2],near1[200001],near2[200001],far1[200001],far2[200001];
array <int,2> interv1[200001],interv2[200001];
int n,k;
string s;
int sum(int l,int r,int u){
return pre[r][u]-pre[l-1][u];
}
bool dfs1(int i,int gr){
if(vis[i][gr]!=0) return dp1[i][gr];
if(i==n+1){
if(gr==k+1) return 1;
return 0;
}
vis[i][gr]=1;
if(s[i]=='X') return 0;
if(i<=n){
dp1[i][gr]|=dfs1(i+1,gr);
}
if(i+siz[gr]<=n&&gr!=k+1&&sum(i+1,i+siz[gr],0)==0){
dp1[i][gr]|=dfs1(i+siz[gr]+1,gr+1);
}
return dp1[i][gr];
}
bool dfs2(int i,int gr){
if(vis[i][gr]!=0) return dp2[i][gr];
if(i==0){
if(gr==0) return 1;
return 0;
}
vis[i][gr]=1;
if(s[i]=='X') return 0;
if(i>=1){
dp2[i][gr]|=dfs2(i-1,gr);
}
if(i-siz[gr]>=0&&gr!=0&&sum(i-siz[gr],i-1,0)==0){
dp2[i][gr]|=dfs2(i-siz[gr]-1,gr-1);
}
return dp2[i][gr];
}
string solve_puzzle(string t, vector<int> c) {
s="a";s+=t;
n=s.size()-1;k=c.size();
for(int i=0;i<c.size();i++) siz[i+1]=c[i];
for(int i=1;i<=n;i++){
if(s[i]=='X') pre[i][1]++;
if(s[i]=='_') pre[i][0]++;
pre[i][0]+=pre[i-1][0];
pre[i][1]+=pre[i-1][1];
}
near1[0]=far2[0]=0;
for(int i=1;i<=n+1;i++){
near1[i]=near1[i-1];
if(s[i]=='_') near1[i]=i;
if(s[i]=='X') far2[i]=i;
}
near2[n+1]=far1[n+1]=n+1;
for(int i=n;i>=0;i--){
near2[i]=near2[i+1];
far1[i]=far1[i+1];
if(s[i]=='_') near2[i]=i;
if(s[i]=='X') far1[i]=i;
}
dfs1(siz[1]+1,2);
dfs1(1,1);
memset(vis,0,sizeof vis);
dfs2(n-siz[k],k-1);
dfs2(n,k);
dp1[0][1]=1;
dp2[n+1][k]=1;
for(int gr=0;gr<=k+1;gr++){
interv1[gr]={n+1,n+1};
interv2[gr]={-1,-1};
for(int i=0;i<=n+1;i++){
//cout<<"YES "<<i<<" "<<gr<<" "<<dp1[i][gr]<<endl;
if(dp1[i][gr]==1){
if(interv1[gr][0]==n+1) interv1[gr][0]=i;
interv1[gr][1]=i;
}
if(dp2[i][gr]==1){
if(interv2[gr][0]==-1) interv2[gr][0]=i;
interv2[gr][1]=i;
}
}
}
interv2[k][1]=n+1;
if(interv2[k][0]==-1) interv2[k][0]=n+1;
interv1[1][0]=0;
if(interv1[1][1]==n+1) interv1[1][1]=0;
//cout<<interv2[1][0]<<" "<<interv2[1][1]<<endl;
//cout<<dp1[3][1]<<endl;
string ans="";
for(int i=1;i<=n;i++){
bool B=0,W=0;
for(int gr=1;gr<=k;gr++){
W|=dp1[i][gr];
//if(i==3&&gr==1) cout<<interv2[gr][0]<<" "<<far2[interv2[gr][0]]<<" "<<max(i,far2[interv2[gr][0]])<<" "<<interv1[gr][1]<<endl;
if(i<=interv1[gr][0]||i>=interv2[gr][1]||(near2[i]-near1[i]-1)<siz[gr]||(max(i,far2[interv2[gr][0]])-min(i,far1[interv1[gr][1]])+1)>siz[gr]) continue;
int siz1=max(0,(interv2[gr][0]-i))+max(0,(i-interv1[gr][1]));
int siz2=max(0,(interv2[gr][1]-i))+max(0,(i-interv1[gr][0]));
//if(i==4) cout<<i<<" "<<gr<<" "<<max(0,(i-interv1[gr][1]))<<" "<<siz2-1<<endl;
// exit(0);
if(siz1-1<=siz[gr]&&siz[gr]-1<=siz2) B=1;
}
W|=dp1[i][k+1];
//cout<<W<<" "<<B<<endl;
if(W==0&&B==1) ans+='X';
if(W==1&&B==0) ans+='_';
if(W==1&&B==1) ans+='?';
}
//cout<<n<<endl;
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
paint.h:1:9: warning: #pragma once in main file
1 | #pragma once
| ^~~~
paint_c.h:1:9: warning: #pragma once in main file
1 | #pragma once
| ^~~~
# | 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... |