#include "paint.h"
#include <bits/stdc++.h>
#include <cstdlib>
using namespace std;
int n, k;
const int mxn = 200005, mxk = 105;
bool ok(int l, int r, vector<char> &s_u, vector<int> &p) {
if (p[r] - p[l - 1]) return false;
if (s_u[r + 1] == 'X' || s_u[l - 1] == 'X') return false;
return true;
}
void do_dp(vector<vector<vector<char>>> &dp, vector<char> &s_u, vector<int> &c_u) {
vector<int> p(n + 5);
for (int i = 1; i <= n; i++) p[i] = p[i - 1] + (s_u[i] == '_');
dp[0][0][0] = 1; dp[0][0][1] = 1;
for (int i = 1; i <= n; i++) {
if (s_u[i] != 'X') {
dp[i][0][0] = dp[i - 1][0][0];
dp[i][0][1] = dp[i - 1][0][1];
}
for (int j = 1; j <= k; j++) {
if (s_u[i] != 'X') {
dp[i][j][0] = (dp[i - 1][j][0] || dp[i - 1][j][1]);
}
if (s_u[i] != '_') {
if (i >= c_u[j]) {
if (ok(i - c_u[j] + 1, i, s_u, p)) dp[i][j][1] = dp[i - c_u[j]][j - 1][0];
}
}
}
}
}
string solve_puzzle(string si, vector<int> ci) {
n = (int)si.size(); k = (int)ci.size();
vector<char> s_norm(n+5, '!'), s_rev(n+5, '!');
vector<int> c_norm, c_rev;
for (int i = 1; i <= n; i++) s_norm[i] = si[i - 1];
for (int i = n; i >= 1; i--) s_rev[i] = si[n - i];
c_norm.push_back(-1e9);
for (auto &x : ci) c_norm.push_back(x);
c_rev.push_back(-1e9);
for (int i = k - 1; i >= 0; i--) c_rev.push_back(ci[i]);
vector<vector<vector<char>>> dp(n + 5, vector<vector<char>>(k + 5, vector<char>(2)));
vector<vector<vector<char>>> dp2(n + 5, vector<vector<char>>(k + 5, vector<char>(2)));
do_dp(dp, s_norm, c_norm);
do_dp(dp2, s_rev, c_rev);
vector<char> w(n + 5), bk(n + 5);
vector<int> d(n + 6);
for (int i = 1; i <= n; i++) {
if (si[i - 1] != '.') {
if (si[i - 1] == '_') w[i] = 1;
else bk[i] = 1;
continue;
}
for (int bl = 0; bl <= k; bl++) {
int br = k - bl;
if (dp[i][bl][0] && dp2[n - i + 1][br][0]) w[i] = 1;
}
}
for (int b = 1; b <= k; b++) {
for (int j = c_norm[b]; j <= n; j++) {
if (!dp[j][b][1]) continue;
bool sf = false;
if (j == n) sf = (b == k);
else sf = dp2[n - j][k - b][0];
if (!sf) continue;
int l = j - c_norm[b] + 1;
int r = j;
d[l]++;
d[r + 1]--;
}
}
int cur = 0;
for (int i = 1; i <= n; i++) {
cur += d[i];
if (cur) bk[i] = 1;
}
string ans(n, '!');
for (int i = 1; i <= n; i++) {
if (si[i - 1] != '.') {
ans[i - 1] = si[i - 1];
continue;
}
if (w[i] && !bk[i]) ans[i - 1] = '_';
else if (!w[i] && bk[i]) ans[i - 1] = 'X';
else if (w[i] && bk[i]) ans[i - 1] = '?';
else ans[i - 1] = 'L';
}
return ans;
}