Submission #535440

#TimeUsernameProblemLanguageResultExecution timeMemory
535440mario05092929Paint By Numbers (IOI16_paint)C++14
100 / 100
391 ms162244 KiB
#include "paint.h"
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair <ll,ll> pi;
typedef vector <int> vec;
const ll INF = 1e18;
char s[200005];
int a[200005],pwh[200005],pbl[200005],canbl[105][200005],canbr[105][200005];
int n,k,canX[200005];
bool can_[200005];

string solve_puzzle(string S,vec c) {
    n = S.length(), k = c.size();
    for(int i = 0;i < n;i++) {
        s[i+1] = S[i];
        pwh[i+1] = pwh[i]+(s[i+1] == '_');
        pbl[i+1] = pbl[i]+(s[i+1] == 'X');
    }
    canbl[0][0] = 1;
    for(int i = 0;i < k;i++) a[i+1] = c[i];
    for(int i = 0;i <= k;i++) {
        if(i == 1) {
            for(int j = 0;j <= n+1;j++) canbl[i][j] = 0;
            for(int j = a[i];j <= n;j++) if(pbl[j-a[i]] == 0&&pwh[j] == pwh[j-a[i]]) canbl[i][j] = 1;
        }
        for(int j = 0;j <= n;j++) {
            //cout << canbl[i][j] << ' ';
            if(canbl[i][j]&&s[j+1] != 'X') {
                canbl[i][j+1] = 1;
                if(i == k||i == 0) continue;
                if(j+a[i+1]+(i>0) <= n&&pwh[j+a[i+1]+(i>0)] == pwh[j+(i>0)]) canbl[i+1][j+a[i+1]+(i>0)] = 1;
            }
        }
        //cout << '\n';
    }
    //cout << '\n';
    canbr[k+1][n+1] = 1;
    for(int i = k+1;i >= 1;i--) {
        if(i == k) {
            for(int j = 0;j <= n+1;j++) canbr[i][j] = 0;
            for(int j = n-a[i]+1;j >= 1;j--) if(pbl[j+a[i]-1] == pbl[n]&&pwh[j-1] == pwh[j+a[i]-1]) canbr[i][j] = 1;
        }
        for(int j = n+1;j >= 1;j--) {
            //cout << canbr[i][j] << ' ';
            if(canbr[i][j]&&s[j-1] != 'X') {
                canbr[i][j-1] = 1;
                if(i == 1||i == k+1) continue;
                if(j-a[i-1]-(i<k+1) >= 1&&pwh[j-a[i-1]-(i<k+1)-1] == pwh[j-1-(i<k+1)]) canbr[i-1][j-a[i-1]-(i<k+1)] = 1;
            }
        }
        //cout << '\n';
    }
    for(int i = 1;i <= n;i++) {
        for(int j = 0;j <= k;j++) {
            if(canbl[j][i-1]&&canbr[j+1][i+1]&&s[i] != 'X') can_[i] = 1;
        }
        //cout << i << ' ' << can_[i] << '\n';
    }
    for(int i = 1;i <= k;i++) {
        for(int j = a[i];j <= n;j++) {
            bool bl,br;
            if(j-a[i] <= 0) bl = (i == 1);
            else bl = (canbl[i-1][j-a[i]-1]&&s[j-a[i]] != 'X');
            if(j == n) br = (i == k);
            else br = (canbr[i+1][j+2]&&s[j+1] != 'X');
            if(bl&&br&&pwh[j] == pwh[j-a[i]]) canX[j-a[i]+1]++, canX[j+1]--;
        }
    }
    for(int i = 1;i <= n;i++) canX[i] += canX[i-1];//, cout<< canX[i] << ' ';
   // cout << '\n';
    string ans;
    for(int i = 1;i <= n;i++) {
        if(s[i] != '.') ans += s[i];
        else if(canX[i]&&can_[i]) ans += '?';
        else if(canX[i]) ans += 'X';
        else if(can_[i]) ans += '_';
        else while(1);// cout << i << ' ' << "WTF\n";
    }
    return ans;
}
#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...