Submission #1335112

#TimeUsernameProblemLanguageResultExecution timeMemory
1335112DeltaStructPaint By Numbers (IOI16_paint)C++20
100 / 100
212 ms17620 KiB
#include <bits/stdc++.h>
using namespace std;
#include "paint.h"

string solve_puzzle(string s,vector<int> A){
  int n = s.size(),m = A.size(); ++m;
  bitset<102> tmp;
  vector<int> B(1);
  for (int i(0);i < n;++i) B.emplace_back(B.back()+(s[i]=='_'));
  vector<bitset<102>> dpl0(1),dpl1(1); dpl0[0][0] = dpl1[0][0] = 1;
  for (int i(0);i < n;++i){
    tmp.reset();
    if (s[i]!='X'&&dpl1.back()[0]) tmp[0] = 1;
    for (int k(0);k < m-1;++k) if (i-A[k]+1-(bool)k>=0&&B[i+1]-B[i-A[k]+1]==0&&(k==0||s[i-A[k]]!='X')) tmp[k+1] = dpl1[i-A[k]+1-(bool)k][k];
    dpl0.emplace_back(tmp);
    if (s[i]=='X') dpl1.emplace_back(tmp);
    else dpl1.emplace_back(dpl1.back()|tmp);
  }
  vector<bitset<102>> dpr0(1),dpr1(1); dpr0[0][m] = dpr1[0][m] = 1;
  for (int i(0);i < n;++i){
    tmp.reset();
    if (s[n-i-1]!='X'&&dpr1.back()[m]) tmp[m] = 1;
    for (int k(0);k < m-1;++k) if (i-A[k]+1-(k!=m-2)>=0&&B[n-i+A[k]-1]-B[n-i-1]==0&&(k==m-2||s[n-i-1+A[k]]!='X')) tmp[k+1] = dpr1[i-A[k]+1-(k!=m-2)][k+2];
    dpr0.emplace_back(tmp);
    if (s[n-i-1]=='X') dpr1.emplace_back(tmp);
    else dpr1.emplace_back(dpr1.back()|tmp);
  }
  reverse(dpr0.begin(),dpr0.end()),reverse(dpr1.begin(),dpr1.end());
  string ans = "._X?";
  vector<int> R(n);
  for (int i(0);i < n;++i) if (s[i]!='X'){
    for (int k(0);k < m;++k) if (dpl1[i][k]&&dpr1[i+1][k+1]) R[i] |= 1;//,(cout<<i<<' '<<k<<endl);
  }
  vector<int> D(n+1);
  for (int k(1);k < m;++k){
    for (int i(0);i < n-(k!=m-1);++i) if (dpl0[i+1][k]&&dpr1[i+1+(k!=m-1)][k+1]&&s[i+1]!='X'){
      //cout << i << ' ' << k << endl;
      ++D[max(i-A[k-1]+1,0)],--D[i+1];
      //for (int j(i);j > i-A[k-1]&&(R[j]>>1)==0;--j) R[j] |= 2;
    }
  }
  for (int i(0),k(D[0]);i < n;++i) R[i] |= 2*(k!=0),k += D[i+1];
  string res;
  for (int i(0);i < n;++i) res += ans[R[i]];
  return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...