Submission #862514

#TimeUsernameProblemLanguageResultExecution timeMemory
862514hgmhcPaint By Numbers (IOI16_paint)C++17
32 / 100
61 ms612 KiB
#include <bits/stdc++.h> using namespace std; using ii = pair<int,int>; using ll = long long; using vi = vector<int>; #define rep(i,a,b) for (auto i = (a); i <= (b); ++i) #define per(i,a,b) for (auto i = (b); i >= (a); --i) #define all(x) begin(x), end(x) #define siz(x) int((x).size()) #define Mup(x,y) x = max(x,y) #define mup(x,y) x = min(x,y) #define fi first #define se second #define dbg(...) fprintf(stderr,__VA_ARGS__) #define ensure(...) if (!(__VA_ARGS__)){ fprintf(stderr,"Error in %dth line.", __LINE__), exit(-1); } const int N = 103, K = 103; int n, k; bool valid(const string &s, const vi &c) { bool dp[N][K]{}; int _pfx[N]{}; rep(i,1,n) _pfx[i]=_pfx[i-1]+(s[i]=='_'); rep(i,1,n) { if (s[i] == 'X') { rep(j,i,i+c[1]-1) { if (s[j] == '_') break; if (c[1] <= j and _pfx[j]-_pfx[j-c[1]] == 0) dp[j][1] = true; } break; } if (i >= c[1] and _pfx[i]-_pfx[i-c[1]] == 0) { dp[i][1] = true; } } rep(i,1,n) if (s[i] != '_') { rep(j,2,k) { bool flag = 1; per(x,i-c[j]+1,i) if (s[x] == '_') flag = 0; if (s[i-c[j]] == 'X') flag = 0; if (!flag) continue; per(x,1,i-c[j]-1) { if (s[x] == '_') break; dp[i][j] |= dp[x][j-1]; } } } // rep(i,1,n) rep(j,1,k) cerr << dp[i][j] << " \n"[j == k]; per(i,1,n) { if (i < n and s[i+1] == 'X') break; if (dp[i][k]) return true; } return false; } string solve_puzzle(string s, vi c) { n = siz(s), k = siz(c); s = "$"+s, c.insert(begin(c),0); string res(n,'$'); // valid("$X.._._....",c); rep(i,1,n) { char x = s[i]; if (x != '.') { res[i-1] = x; continue; } s[i] = 'X'; if (not valid(s,c)) res[i-1] = '_'; s[i] = '_'; if (not valid(s,c)) res[i-1] = 'X'; if (res[i-1] == '$') res[i-1] = '?'; s[i] = x; } return res; } #ifdef LOCAL const int S_MAX_LEN = 200 * 1000; char buf[S_MAX_LEN + 1]; int main() { ensure(1 == scanf("%s", buf)); std::string s = buf; int c_len; ensure(1 == scanf("%d", &c_len)); std::vector<int> c(c_len); for (int i = 0; i < c_len; i++) { ensure(1 == scanf("%d", &c[i])); } std::string ans = solve_puzzle(s, c); printf("%s\n", ans.data()); return 0; } #endif
#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...