Problem:
Score : 200 points

Problem Statement

For a string S consisting of the uppercase English letters P and D, let the doctoral and postdoctoral quotient of S be the total number of occurrences of D and PD in S as contiguous substrings. For example, if S = PPDDP, it contains two occurrences of D and one occurrence of PD as contiguous substrings, so the doctoral and postdoctoral quotient of S is 3.

We have a string T consisting of P, D, and ?.

Among the strings that can be obtained by replacing each ? in T with P or D, find one with the maximum possible doctoral and postdoctoral quotient.

Constraints

1 \leq |T| \leq 2 \times 10^5

T consists of P, D, and ?.

Input

Input is given from Standard Input in the following format:

T

Output

Print one string with the maximum possible doctoral and postdoctoral quotient among the strings that can be obtained by replacing each ? in T with P or D.
If there are multiple such strings, you may print any of them.

Sample Input 1

PD?D??P

Sample Output 1

PDPDPDP

This string contains three occurrences of D and three occurrences of PD as contiguous substrings, so its doctoral and postdoctoral quotient is 6, which is the maximum doctoral and postdoctoral quotient of a string obtained by replacing each ? in T with P or D.

Sample Input 2

P?P?

Sample Output 2

PDPD

Solution in C++ (GCC 9.2.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define REP(i, n) for (ll i = 0; i < (ll)n; i++)
#define all(x) (x).begin(), (x).end()
#define unique(x) x.erase(unique(x.begin(), x.end()), x.end());
// map<int,int> mp;

int main() {
  string T;
  cin >> T;

  int ans_count = 0;
  int ans_count1 = 0;

  string ans_T = "";

  for (int i = 0; i < T.size() - 1; i += 2) {
    string chk = T.substr(i, 2);

    if (chk == "PD" || chk == "?D" || chk == "P?" || chk == "??") {
      ans_count++;
      ans_count++;
      ans_T += "PD";

    } else if (chk == "DD" || chk == "D?") {
      ans_count += 2;
      ans_T += "DD";
    }
  }

  if (T.size() % 2 != 0) {
    if (T.at(T.size() - 1) == 'P') {
      ans_T += T.at(T.size() - 1);
    } else if (T.at(T.size() - 1) == 'D') {
      ans_count++;
      ans_T += T.at(T.size() - 1);
    } else {
      ans_T += 'D';
      ans_count++;
    }
  }

  string ans_T1 = "";

  if (T.size() % 2 != 0) {
    if (T.at(0) == 'P') {
      ans_T1 += T.at(0);
    } else if (T.at(0) == 'D') {
      ans_T1 += T.at(0);
      ans_count1++;
    } else {
      ans_T1 += 'D';
      ans_count1++;
    }
  }

  for (int i = 1; i < T.size(); i += 2) {
    string chk = T.substr(i, 2);

    if (chk == "PD" || chk == "?D" || chk == "P?" || chk == "??") {
      ans_count1++;
      ans_count1++;
      ans_T1 += "PD";

    } else if (chk == "DD" || chk == "D?") {
      ans_count1 += 2;
      ans_T1 += "DD";
    }
  }

  if (ans_count >= ans_count1) {
    cout << ans_T << endl;
  } else {
    cout << ans_T1 << endl;
  }
}