Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.32 KB | None | 0 0
  1. #include "paint.h"
  2.  
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <iostream>
  6. #include <string>
  7. #include <cstring>
  8.  
  9. #define PB push_back
  10.  
  11. using namespace std;
  12.  
  13. typedef vector < int > vi;
  14.  
  15. const int N = 2e5 + 500;
  16. const int K = 105;
  17.  
  18. int pref[N], n, can_W[N], can_B[N], dp[N][K][2];
  19. string s;
  20. vi c;
  21.  
  22. int dob(int i,int j){
  23.     if(j >= n) return 1;
  24.     return pref[j] - (i ? pref[i - 1] : 0);
  25. }
  26.  
  27.  
  28. int f(int i,int j,int fl){
  29.     if(i == n) return (j == c.size());
  30.     if(dp[i][j][fl] != -1) return dp[i][j][fl];
  31.     //printf("%d %d\n", i, j);
  32.     int ret = 0;
  33.     if(s[i] == '_'){
  34.         can_W[i] = 1;
  35.         return f(i + 1, j, 1);
  36.     }
  37.     if(s[i] != 'X'){
  38.         if(f(i + 1, j, 1)){
  39.             can_W[i] = 1;
  40.             ret = 1;
  41.         }
  42.     }
  43.     if(j < c.size() && !dob(i, i + c[j] - 1) && fl){
  44.         if(f(i + c[j], j + 1, 0)){
  45.             can_B[i]++;
  46.             can_B[i + c[j]]--;
  47.             ret = 1;
  48.         }
  49.     }
  50.     return dp[i][j][fl] = ret;
  51. }
  52.  
  53. string solve_puzzle(string ss, vi cc) {
  54.     memset(dp, -1, sizeof(dp));
  55.     s = ss; c = cc; n = (int)s.size();
  56.     for(int i = 0;i < n;i++)
  57.         pref[i] = (s[i] == '_') + (i ? pref[i - 1] : 0);
  58.     f(0, 0, 1);
  59.     for(int i = 1;i < n;i++)
  60.         can_B[i] += can_B[i - 1];
  61.     string sol;
  62.     for(int i = 0;i < n;i++){
  63.         if(can_W[i] && can_B[i]) sol.PB('?');
  64.         else if(can_W[i]) sol.PB('_');
  65.         else sol.PB('X');
  66.     }
  67.     return sol;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement