제출 #1347659

#제출 시각아이디문제언어결과실행 시간메모리
1347659biankPaint By Numbers (IOI16_paint)C++20
100 / 100
224 ms23116 KiB
#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;
using ii = pair<int, int>;
using vb = vector<bool>;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

using bs = bitset<101>;

vector<bs> calcDP(string s, const vi &c) {
    const int n = sz(s), k = sz(c);
    vi pref(n + 1);
    pref[0] = 0;
    forn(i, n) pref[i + 1] = pref[i] + (s[i] == '_');
    vector<vector<bs>> dp(n + 1, vector<bs>(2));
    dp[0][0][0] = true;
    vector<bs> ret(n + 1);
    forn(i, n) {
        forn(j, k + 1) forn(last, 2) if (dp[i][last][j]) {
            if (s[i] != 'X') dp[i + 1][0][j] = true;
            if (last == 0 && j < k && i + c[j] <= n && pref[i + c[j]] - pref[i] == 0) {
                dp[i + c[j]][1][j + 1] = true;
            }
        }
        ret[i] = dp[i][0];
        dp[i].clear();
    }
    ret[n] = dp[n][0];
    dp[n].clear();
    return ret;
}

string solve_puzzle(string s, vi c) {
    const int n = sz(s), k = sz(c);
    vi pref(n + 1);
    pref[0] = 0;
    forn(i, n) pref[i + 1] = pref[i] + (s[i] == '_');
    vector<bs> dpPref = calcDP(s, c);
    reverse(all(s)), reverse(all(c));
    vector<bs> dpSuff = calcDP(s, c);
    reverse(all(s)), reverse(all(c));
    
    vi checkBlack(n + 1, 0);
    forn(i, n) forn(j, k) if (dpPref[i][j] && i + c[j] <= n && pref[i + c[j]] - pref[i] == 0 && dpSuff[n - i - c[j]][k - j - 1]) {
        checkBlack[i]++;
        checkBlack[i + c[j]]--;
    }
    forn(i, n) checkBlack[i + 1] += checkBlack[i];
    
    string ret = "";
    forn(i, n) {
        bool checkWhite = false;
        forn(j, k + 1) {
            checkWhite |= dpPref[i + 1][j] && dpSuff[n - i][k - j];
        }
        if (checkBlack[i] && checkWhite) {
            ret += '?';
        } else if (checkBlack[i]) {
            ret += 'X';
        } else if (checkWhite) {
            ret += '_';
        } else {
            assert(false);
        }
    }
    return ret;
}
#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...